Какова правильная кодировка для преобразования строки в массив байтов
-
11-07-2019 - |
Вопрос
У меня какая-то проблема с кодировкой в моем ASP.NET HttpHandler, который загружает файл.Содержимое файла передается в скрытой переменной формы с веб-страницы ColdFusion, которая использует нечто под названием "ToBase64".
В ColdFusion код, используемый для помещения содержимого файла в форму, выглядит следующим образом:
<cffile action="readBinary" file="#FileName#" variable="objBinaryData">
<cfset b64file = #toBase64(objBinaryData)#>
<form name="sendToHandler"
action="http://myserver/mysite/UploadHandler.ashx" method="post">
<cfoutput>
<input type="hidden" name="objBinaryData" value="#b64file#" />
Когда мой UploadHandler.ashx опубликован, я получаю строку из формы следующим образом:
string fileContent = context.Request.Form["objBinaryData"];
Далее я преобразую строку в массив байтов следующим образом:
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
Вот функция, которую я использую для преобразования строки:
public static byte[] StringToByteArray(string str, EncodingType encodingType)
{
System.Text.Encoding encoding = null;
switch (encodingType)
{
case EncodingType.ASCII:
encoding = new System.Text.ASCIIEncoding();
break;
case EncodingType.Unicode:
encoding = new System.Text.UnicodeEncoding();
break;
case EncodingType.UTF7:
encoding = new System.Text.UTF7Encoding();
break;
case EncodingType.UTF8:
encoding = new System.Text.UTF8Encoding();
break;
}
return encoding.GetBytes(str);
}
public enum EncodingType
{
ASCII,
Unicode,
UTF7,
UTF8
}
Для меня очевидно, что вызов вышеупомянутой функции с помощью EncodingType.ASCII неверен, но я очень смущен тем, что было бы правильно?Каково правильное "соответствие" между "Base64", отправленным из ColdFusion, и способом, которым строка должна быть закодирована в .Net?
Пожалуйста, обратите внимание, что весь код "работает", но последующее извлечение файла показывает, что он зашифрован, и я почти уверен, что у меня здесь неправильная кодировка.
РЕДАКТИРОВАТЬ-обновлять:
Я добавил код перечисления, ранее опущенный.Я перепробовал все эти типы кодировки;все они приводят к образованию "мусора".Это:Я перепробовал каждый из этих вариантов:
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
byte[] binData = StringToByteArray(fileContent, EncodingType.Unicode);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF7);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF8);
Ни один из них не работает должным образом.Поскольку я прочитал предложенную вами функцию, она должна быть в Юникоде.Обратите внимание, что я хочу вернуть массив байтов, а не преобразованную строку.Все еще в замешательстве.
ОТВЕТ:
Я просто исключил перечисление, и функция, которую я написал, называлась StringToByteArray .Вместо этого я закодировал следующее:
byte[] binData = Convert.FromBase64String(fileContent);
Решение
Посмотрите на Convert.FromBase64String()
функция
Другие советы
Base64 - это схема кодирования, которая позволяет вам представлять двоичные данные в виде последовательности символов ASCII, чтобы их можно было включать в текстовые файлы и сообщения электронной почты, в которых исходные двоичные данные неприемлемы.Приведенные ниже примеры показывают кодировку и декодирование строк в юникоде.Дайте мне знать, если это то, что вы хотели, если нет, я могу уточнить это для вас.
//Encoding
public static string StringToBase64 (string src) {
// Get's byte representation unicode string
byte[] b = Encoding.Unicode.GetBytes(src);
// Returns Base64-encoded string
return Convert.ToBase64String(b);
}
//Decoding
public static string Base64ToString (string src) {
// Decodes Base64-encoded string to a byte array
byte[] b = Convert.FromBase64String(src);
// Returns decoded Unicode string
return Encoding.Unicode.GetString(b);
}