2016-10-14 2 views
0

У меня проблема с преобразованием из строки base-64 в обычный, читаемый текст. Я провел некоторое исследование и обнаружил, что строки базы 64 должны иметь длину, кратную 4. Поэтому я использовал padRight, чтобы дать ему допустимую длину, но я все равно получаю ту же ошибку. Например, я вхожу в «привет», и он кодируется как «⚫aGk ====», который кажется мне 8 символов (что, очевидно, кратно 4). Когда я пытаюсь прочитать его, он читается с длиной 1. Я также использую расширение пользовательского файла, которое я только что назвал «.bgs». Я не уверен, что это что-то делает. Запись в этот файл как строка base64 и чтение/декодирование - это единственное, что я пытаюсь сделать.Недопустимая длина VB.net для базового 64-символьного массива или строки

Вот мой код:

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.

Вы видите точку, потому что используете двоичную запись, которая prefixes strings with their length при записи в файл.

Затем вы используете 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

Смежные вопросы