Мне нужно закодировать некоторый исходный код 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)
И я добавил alert()
вместо encodedSourceCode
в клиентский скрипт.
Результаты оказываются такими:
Первый MsgBox: Пусто
Второй MsgBox: «System.String»
Last 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()
).
Какая-то скрытая разница в ключе "закодированный исходный код"? Он определенно должен отображать строку.
Все пять строк, которые я процитировал выше, в моем коде идут подряд. Ничего между ними. И все результаты напрямую получают данные из HTTP-запроса, поэтому они должны быть одинаковыми.
Кажется, что строка просто слишком длинная без «переносимых» символов, я полагаю. MsgBox
вырезает «последнее слово» и ничего не показывает.
Это может подтвердить это:
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"))
1-й: показывает текст.
2-й: показывает пустую коробку, длина = 44 000
3-й: показывает текст, хотя общая длина составляет 44 001, но его можно перенести на пробел.
Исходный код в последнем MsgBox
тоже очень длинный, но внутри рамки можно показать много строк с отступом.
Смотрите мою правку. Как я уже сказал, в строке base64 нет символов не-слово, это, кажется, главное.
Это не фокус. Я протестировал и упомянул об этом только для того, чтобы показать, что
HttpContext.Current.Request.Form("encodedSourceCode")
— это простая строка, которая должна отображаться вMsgBox
. Главное, почемуHttpContext.Current.Request.Form("encodedSourceCode")
пусто вMsgBox
, когда оно может вернуть ожидаемый результат после декодирования.