为什么 Base64 字符串在 Message Box 中显示为空?

Why is a Base64 string displayed as empty in Message Box?

我必须在提交表单之前将一些HTML源代码编码成base64格式,然后在后面的代码中将其解码回原始代码。下面是 MsgBox 的测试代码:

MsgBox(HttpContext.Current.Request.Form("encodedSourceCode"))
MsgBox(Convert.ToString(HttpContext.Current.Request.Form("encodedSourceCode").GetType()))
Dim b = Convert.FromBase64String(HttpContext.Current.Request.Form("encodedSourceCode"))
Dim html = System.Text.Encoding.UTF8.GetString(b)
MsgBox(html)

并且我在客户端脚本中为 encodedSourceCode 添加了一个 alert()

结果是:

第一个 MsgBox:空

第二个消息框:"System.String"

最后一个 MsgBox:原始 HTML 源代码

并且 JS 警告对话框显示 base64 字符串,它由一堆数字和字母组成。

总之,一切都很好,除了第一个MsgBox,它应该是base64编码的字符串,但结果是空的。为什么?正常吗?

其实没什么大不了的,因为即使是最终结果(解码后)似乎也没有问题,但我只是好奇为什么中间结果没有按预期显示。

它绝对与 base64 字符串无关,因为它们是简单的字符串。证明如下:

    Dim myString = "Hello world, this is just an ɇxâmpŀƏ ʬith some non-ansi characters..."
    Dim myEncoding As Encoding = Encoding.UTF8
    MsgBox(myString)
    Dim myBase64 = Convert.ToBase64String(myEncoding.GetBytes(myString))
    MsgBox(myBase64)
    Dim myStringAgain = myEncoding.GetString(Convert.FromBase64String(myBase64))
    MsgBox(myStringAgain)
    MsgBox(If(StringComparer.Ordinal.Equals(myString, myStringAgain), "same", "different"))

MsgBox(Convert.ToString(HttpContext.Current.Request.Form("encodedSourceCode").GetType()))

结果为 "System.String",因为您将类型的名称转换为字符串(参见 xxx.GetType())。

似乎字符串太长了,没有 'wrappable' 个字符,我想。 MsgBox 删除 'last word' 并且什么都不显示。
这可以证实:

dim test = HttpContext.Current.Request.Form("encodedSourceCode")
MsgBox(test) ' empty
test = test.Substring(0, 20)
MsgBox(test) ' shows the first 20 characters

在 LinqPad 中测试,我得到大约 43.000 个字符的限制:

MsgBox("".PadLeft(43000, "a"))
MsgBox("".PadLeft(44000, "a"))
MsgBox("".PadLeft(43000, "a") & " " & "".PadLeft(1000, "a"))

第一个:显示文本。
第二:显示空框,长度 = 44.000
第三:显示文本,虽然总长度是44.001,但是可以在space.

处换行