2016-10-14 82 views
0

我有一個從base-64字符串轉換爲正常,可讀文本的問題。我做了一些研究,發現base 64字符串的長度必須是4的倍數。所以我用padRight給它一個有效的長度,但是我一直得到相同的錯誤。例如,我輸入「hi」,它編碼爲「⚫aGk====」,這對我來說似乎有8個字符(顯然是4的倍數)。當我嘗試閱讀它時,它的長度爲1. 我還使用了一個自定義文件擴展名,我只是將其稱爲「.bgs」。我不確定這是否會做任何事情。作爲base64字符串寫入該文件並讀取/解碼是我嘗試做的唯一事情。對於基本64字符數組或字符串VB.net無效的長度

這裏是我的代碼:

Public Class Form1 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    Me.Close() 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Using bs As New BinaryWriter(File.Open("saveFile.bgs", FileMode.Create)) 

     Dim originText As String = TextBox1.Text 
     Dim cipherText As String 

     Dim byteArray As Byte() = System.Text.Encoding.UTF8.GetBytes(originText) 
     cipherText = Convert.ToBase64String(byteArray) 

     Dim realLength As Integer = cipherText.Length() + 1 
     Dim len As Integer = (realLength Mod 4) 
     If (len > 0) Then bs.Write(cipherText.PadRight(realLength + (3 - len), "=")) 


     bs.Close() 

    End Using 
End Sub 

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
    Using bs As New BinaryReader(File.Open("saveFile.bgs", FileMode.Open)) 

     Dim cipherText2 As String = bs.Read() 
     Dim originText2 As String = "Failed" 

     TextBox2.Text = cipherText2.Length() 'reports length of 1 
     Try 
      Dim byteArray2 As Byte() = Convert.FromBase64String(cipherText2) 
      originText2 = System.Text.Encoding.UTF8.GetString(byteArray2) 
     Catch ex As Exception 

     End Try 

     'TextBox2.Text = originText2 

    End Using 
End Sub 

任何幫助,非常感謝!

更新:它看起來像.bgs文件中看到的第一個字符(上面的點),當我用記事本打開時控制cipherText2的內容,它只是一個數字,解釋爲什麼長度如此低。

回答

1

Base64僅使用可打印的ASCII字符進行編碼。

由於您在寫入文件時使用的是二進制寫入器,因此您正在看到該點。

則您使用的Read代替ReadString所以你讀取的字符串長度爲數字(其中,因爲不使用像Option Strict On你應該然後隱式轉換爲字符串)。

您可以使用ReadString而不是Read來修復它,但如果您使用文本編寫器,則會更容易。

您也不應該嘗試填充ToBase64String的結果。它已經給你正確的字符串。

我會重寫你的代碼:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
    Dim originText As String = TextBox1.Text 
    Dim cipherText As String = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(originText)) 

    System.IO.File.WriteAllText("saveFile.bgs", cipherText, System.Text.Encoding.ASCII) 
End Sub 

Private Sub Button3_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button3.Click 
    Dim cipherText2 As String = System.IO.File.ReadAllText("saveFile.bgs", System.Text.Encoding.ASCII) 
    Dim originText2 As String = "Failed" 

    originText2 = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(cipherText2)) 

    'TextBox2.Text = originText2 
End Sub 
+0

正是我需要的。非常感謝! – ArbitraryUser

相關問題