VB.net基本64字符数组或字符串的长度无效

时间:2016-10-14 19:01:43

标签: vb.net encoding base64 formatexception

我遇到从base-64字符串转换为普通可读文本的问题。我做了一些研究,发现base 64字符串的长度必须是4的倍数。所以我使用padRight给它一个有效的长度,但我一直得到同样的错误。例如,我输入“hi”并将其编码为“⚫aGk====”,这对我来说似乎是8个字符(显然是4的倍数)。当我尝试阅读它时,它读入的长度为1。 我也使用自称为“.bgs”的自定义文件扩展名。我不确定这是否有效。写入此文件作为base64字符串并读取/解码它是我唯一要做的事情。

这是我的代码:

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 个答案:

答案 0 :(得分:1)

Base64仅使用可打印的ASCII字符进行编码。

您正在看点,因为您在写入文件时正在使用ExpressionCombiner的二进制编写器。

然后您使用的是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
相关问题