Как преобразовать строку в байтовый массив base64, это будет правильно? - PullRequest
33 голосов
/ 19 февраля 2010

Я пытаюсь написать функцию, которая преобразует строку в байтовый массив base64. Я пробовал с таким подходом:

public byte[] stringToBase64ByteArray(String input)
{
    byte[] ret = System.Text.Encoding.Unicode.GetBytes(input);
    string s = Convert.ToBase64String(input);
    ret = System.Text.Encoding.Unicode.GetBytes(s);
    return ret;
}

Даст ли эта функция верный результат (при условии, что строка в Unicode)? Спасибо!

Ответы [ 5 ]

57 голосов
/ 15 января 2013

Можно использовать:

От байта [] до строки:

byte[] array = somebytearray;

string result = Convert.ToBase64String(array);

От строки к байту []:

array = Convert.FromBase64String(result);

20 голосов
/ 19 февраля 2010

выглядит хорошо, хотя подход странный. Но используйте Encoding.ASCII.GetBytes () для преобразования строки base64 в byte []. Кодировка Base64 содержит только символы ASCII. Использование Unicode дает вам дополнительный 0 байт для каждого символа.

2 голосов
/ 19 февраля 2010

Представление строки в виде большого двоичного объекта, представленного в виде строки, странно ... по какой причине вы не можете просто использовать строку напрямую?

Строка: всегда Юникод; изменяются закодированные байты. Поскольку base-64 всегда <128, использование юникода в части <em>last кажется излишним (если только этого не требует проводной формат). Лично я бы использовал UTF8 или ASCII для последнего GetBytes, чтобы каждый символ base-64 занимал только один байт.

0 голосов
/ 19 февраля 2010

Да, будет выводиться закодированная в base64 строка UTF-16 с прямым порядком байтов вашей исходной строки. Имейте в виду, что, AFAIK, на самом деле не принято использовать UTF-16 в base64, обычно используется ASCII или UTF-8. Однако здесь важно то, что отправитель и получатель договариваются о том, какую кодировку следует использовать.

Я не понимаю, почему вы преобразуете строку base64 в массив байтов: base64 используется, чтобы избежать несовместимости кодирования при передаче, поэтому вы должны сохранить ее как строку и вывести ее в формате, требуемом протоколом, который вы используете передать данные. И, как сказал Марк, использование UTF-16 для этой цели однозначно излишне, поскольку base64 содержит только 64 символа, все до 128.

0 голосов
/ 19 февраля 2010

Все строки в .NET являются Unicode. Этот код даст правильный результат, но для получателя строки BASE64 также должен быть включен юникод.

...