Как преобразовать строку в массив байтов base64, будет ли это действительным?

Я пытаюсь написать функцию, которая преобразует строку в массив байтов 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;
}

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


person Tomas Vinter    schedule 19.02.2010    source источник
comment
Что такое массив байтов base64? baseNN применяется к текстовым представлениям.   -  person Henk Holterman    schedule 19.02.2010
comment
@Henk: я думаю, он имеет в виду строку Base64, преобразованную в массив байтов.   -  person Bobby    schedule 19.02.2010
comment
ToBase64String ожидает тип byte[], а вы предоставляете строку   -  person Adeel    schedule 19.02.2010


Ответы (5)


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

person Hans Passant    schedule 19.02.2010
comment
Спасибо! Я последую вашему совету и вместо этого использую Encoding.ASCII.GetBytes(). - person Tomas Vinter; 19.02.2010

Вы можете использовать:

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

byte[] array = somebytearray;

string result = Convert.ToBase64String(array);

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

array = Convert.FromBase64String(result);

person Sonhja    schedule 15.01.2013
comment
ни один из них не преобразует строку, отличную от base64, в массив байтов - person mcmillab; 27.06.2019
comment
Convert.FromBase64String должен получить строку, которая уже имеет base64. Это не будет работать на обычной строке. Это не ответ на вопрос. - person Tamir Adler; 28.12.2020

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

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

person Marc Gravell    schedule 19.02.2010
comment
Да, это странно. Причина, по которой я делаю это, заключается в том, что я делаю вызовы API старой устаревшей системы, которая по какой-то причине хочет, чтобы строки передавались как массивы байтов base64. - person Tomas Vinter; 19.02.2010

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

person Darin Dimitrov    schedule 19.02.2010

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

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

person Matteo Italia    schedule 19.02.2010