Как перевести Base64 в массив байтов
- Вставьте Base64 в поле ввода. Пробелы, отсутствующее дополнение, URL-safe символы и префикс
data:допускаются. - Выберите целевой язык под результатом в поле Язык: C / C++, JavaScript, Python, Java, Go, C# или Rust. При открытии страницы выбран JavaScript.
- Нажмите Скопировать результат и вставьте объявление в код. Переименуйте
data, как вам удобно. - Меню Из и В над инструментом меняют формат ввода или вывода, например чтобы читать hex вместо Base64.
Чтобы перевести массив обратно в Base64, используйте массив байтов в Base64: он читает все эти форматы.
Что получается для каждого языка
Base64 3q2+7wABAgOAf/8K декодируется в 12 байт: de ad be ef 00 01 02 03 80 7f ff 0a. Вот результат для каждого значения поля Язык:
const unsigned char data[12] = {
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
};
const data = new Uint8Array([
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
]);
data = b'\xde\xad\xbe\xef\x00\x01\x02\x03\x80\x7f\xff\x0a'
byte[] data = new byte[] {
-34, -83, -66, -17, 0, 1, 2, 3, -128, 127, -1, 10
};
data := []byte{
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a,
}
byte[] data = new byte[] {
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
};
let data: [u8; 12] = [
0xde, 0xad, 0xbe, 0xef, 0x00, 0x01, 0x02, 0x03, 0x80, 0x7f, 0xff, 0x0a
];
Что полезно знать:
- Массивы переносятся после 12 значений в строке. Python пишет по 16 байт в каждую строку
b'...'и берёт длинные данные в круглые скобки: такие строки склеиваются на этапе компиляции. - Java получает знаковые десятичные числа, потому что
(byte) 0xdeпотребовал бы приведения типа для каждого значения больше0x7f. За-34и0xdeстоят одни и те же биты. - C и Rust объявляют длину. Массив в C имеет тип
unsigned char, так что значения больше 127 помещаются без предупреждений. - В Go после последнего значения стоит запятая. Компилятор требует её, когда закрывающая скобка стоит на отдельной строке.
- Python записывает каждый байт как
\x.., даже печатные, поэтому литерал однозначно читается и удобно сравнивается в diff.
Вшивать байты или оставить Base64?
Литерал массива байтов оправдан, когда в программе нет декодера Base64 или ей не стоит тратить время на декодирование: прошивки для микроконтроллеров, тестовые фикстуры, небольшой ключ или сертификат, вкомпилированный в бинарник, таблица подстановки. Платить приходится размером исходного файла. Каждый байт занимает около шести символов (0xde, ), это более чем вчетверо длиннее Base64, так что 10 KB данных превращаются примерно в 60 KB кода.
Если данные меняются или занимают больше нескольких килобайт, храните строку Base64 и декодируйте её при запуске:
import base64
data = base64.b64decode("3q2+7wABAgOAf/8K")
byte[] data = Convert.FromBase64String("3q2+7wABAgOAf/8K");
byte[] data = java.util.Base64.getDecoder().decode("3q2+7wABAgOAf/8K");
const data = Uint8Array.from(atob("3q2+7wABAgOAf/8K"), c => c.charCodeAt(0));
В новых браузерах есть ещё Uint8Array.fromBase64(), он описан в статье Uint8Array.fromBase64 и toBase64. Страницы по C#, Java, Go, Rust и Python подробнее показывают декодеры.
Частые проблемы
- «Некорректный Base64». В строке есть символ вне алфавита, или она обрезана. В сообщении указана позиция, а валидатор Base64 объясняет, что не так со сломанной строкой.
- Ошибки «narrowing conversion» в C++.
char data[] = {0xde};не компилируется в C++11 и новее: обычныйcharна большинстве платформ знаковый, и 222 в него не помещается. Оставьте сгенерированныйunsigned charили используйтеuint8_t. - Огромный результат. Для больших файлов
xxd -i file.binсразу печатает массив для C, а средства встраивания вроде#embedиз C23 позволяют обойтись без массива вовсе.
Вопросы и ответы
Как перевести строку Base64 в массив байтов в C#?
Во время выполнения хватит byte[] data = Convert.FromBase64String(s);. А чтобы зашить байты в код, выберите здесь в поле Язык C# и вставьте объявление new byte[] { ... } в исходник.
Почему в массиве для Java отрицательные числа?
byte в Java знаковый и хранит значения от −128 до 127. Байты от 0x80 до 0xff записываются как числа от −128 до −1, поэтому 0xde превращается в -34. Биты те же самые; b & 0xff возвращает беззнаковое значение.
Как превратить Base64 в байты в Python?
base64.b64decode(s) возвращает объект bytes. Если нужно записать это значение литералом b'\x..', выберите здесь в поле Язык Python.
Для JavaScript получается Uint8Array?
Да, const data = new Uint8Array([...]) с hex-значениями. Он работает в браузерах и Node.js; в Node его можно обернуть в Buffer.from(data), если API нужен Buffer.