Какая правильная кодировка для преобразования строки в байтовый массив - PullRequest
2 голосов
/ 03 августа 2009

У меня возникла какая-то проблема с кодировкой в ​​моем 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);

Ничто из этого не работает должным образом. Когда я прочитал вашу предложенную функцию, это должен быть Unicode. Обратите внимание, что я хочу вернуть байтовый массив, а не преобразованную строку. Все еще очень смущен.

ОТВЕТ:

Я просто удалил перечисление и написанную мной функцию под названием StringToByteArray. Вместо этого я кодировал следующее:

byte[] binData = Convert.FromBase64String(fileContent); 

Ответы [ 2 ]

3 голосов
/ 03 августа 2009

Посмотрите на функцию Convert.FromBase64String()

2 голосов
/ 03 августа 2009

Base64 - это схема кодирования, которая позволяет представлять двоичные данные в виде серии символов ASCII, чтобы их можно было включать в текстовые файлы и сообщения электронной почты, в которых необработанные двоичные данные недопустимы. Приведенные ниже примеры показывают кодирование и декодирование строк Unicode. Дайте мне знать, если это то, что вы хотели, если нет, то я могу еще уточнить для вас.

//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);
}
...