
Я использую CentOS 7 с оболочкой bash. Я думал, что кодирование двоичного файла в base64 будет таким же простым, как
[rails@server lib]$ cat mybinary.file | base64 > /tmp/output.base64
Однако, когда я смотрю на длину файла, я замечаю, что она не кратна четырем.
[rails@server lib]$ ls -al /tmp/output.base64
-rw-rw-r-- 1 rails rails 92935 May 31 15:50 /tmp/output.base64
Я не знаю, правильно ли то, что я сделал, но когда я пытаюсь декодировать файл с помощью библиотеки JS, я получаю сообщение об ошибке, сообщающее о том, что длина строки не кратна четырем, поэтому мне интересно, правильно ли то, что я сделал выше, или есть какой-то другой способ сделать это.
решение1
$ echo foo |base64
Zm9vCg==
$ echo foo |base64 |wc -c
9
Обратите внимание на завершающий символ новой строки в выводе base64
, здесь это девятый символ.
Для более длинного ввода он выдаст больше одной строки, так как по умолчанию он переносит вывод каждые 76 символов. Вы можете отключить перенос (включая последний символ новой строки) с помощью base64 -w0
, или передав вывод через tr -d '\n'
.
решение2
base64
записывает несколько строк для умеренно длинных строк, поэтому вам придется вычесть правильное количество новых строк из размера файла. В некоторых системах утилита может записать текстовый файл DOS (не с помощью base64
GNU coreutils, а с помощью реализации изfourmilab(обычно в системах BSD), в этом случае вам придется вычесть 2 байта на строку, чтобы получить длину закодированной строки.
Отвечая на вопрос в комментариях: «Как мне получить необработанную строку base64 без каких-либо новых залогов и прочего мусора? Только строку base64?»
base64
вставляет переносы строк после каждого 76-го символа, поскольку 76 символов — это максимальная длина строки текста в кодировке MIME (а base 64 чаще всего используется для создания кодировки содержимого для передачи сообщений электронной почты).
Если вы хотите удалить эти переносы строк:
base64 filename | tr -d '\n\r' >outfilename
С base64
помощью GNU coreutils вы можете использовать
base64 -w0 filename >outfilename
решение3
Согласно руководству:
SYNOPSIS base64 [OPTION]... [FILE] DESCRIPTION Base64 encode or decode FILE, or standard input, to standard output. With no FILE, or when FILE is -, read standard input.
Похоже, вы делаете правильно, но вместо того, чтобы ссылаться на бесполезное использование cat
, я бы предложил что-то вроде base64 file > file.b64
.