Как вы преобразуете строку Base64 UTF-8 в двоичный файл из Bash?

Используй источник, Люк!

В исходном коде GNU найдите (я смотрю версию 4.2.2), код, который просматривает деревья каталогов, находится в gnulib / lib / fts.c ​​. В строке 1123 есть следующий комментарий:

Запишите, что fts_read будет делать с этой записью . Во многих случаях он просто fts_stat , но мы можем воспользоваться любой информацией d_type , чтобы оптимизировать ненужные вызовы статистики. Т.е., если действует FTS_NOSTAT и мы не следуем символическим ссылкам (FTS_PHYSICAL), а d_type указывает, что этот не каталог, то мы выиграли мне вообще не нужно регистрировать это . Если это каталог, то (в настоящее время) мы его статизируем независимо от того, чтобы получить номера устройства и индексных дескрипторов. Когда-нибудь мы сможем оптимизировать и это для каталогов, где d_ino, как известно, является действительным.

Итак, они подумали об оптимизации, которую вы описываете, но она не реализована.

1
08.07.2018, 21:48
1 ответ

Пакеты

Да, есть несколько. Пакет coreutils(, установленный по умолчанию в Debian ), содержит как base32 , так и base64 . Они могли либо кодировать, либо декодировать :

.
$ printf '%s' "abc" | base64
YWJj

$ printf '%s' "abc" | base64 | base64 -d
abc

Имейте в виду, что использование эха может добавить завершающую новую строку, которая изменит результирующую строку в кодировке base64:

$ echo "abc" | base64
YWJjCg==

Есть также другие пакеты, которые имеют аналогичные инструменты в пакетах basezи openssl. Последний также обычно устанавливается по умолчанию, первый — нет.

$ printf '%s' "abc" | openssl base64
YWJj

Кодирование

Тот факт, что исходная строка закодирована в любой локали (кодовой страницей ), не имеет отношения к кодировке base64. Программа base64 кодирует байты, а не символы.

$ printf '%s' "éäìǫ" | base64 | base64 -d
éäìǫ

Будет работать на любой системе точно так же. Ну, в любой здравомыслящей системе, в которой echo "éäìǫ"также будет печатать éäìǫв командной строке.

Конечно, если исходная строка закодирована в одной системе, а затем декодирована в системе с другой локалью, вполне вероятно, что вы получите строку Mojibake . Это не проблема, которую нужно решить с помощью base64, это проблема, которую нужно решить, изменив кодировку строки. Вероятно, сiconv.

$ echo -n "Москва" | base64            # in a utf8 locale
0JzQvtGB0LrQstCw

Однако в кириллической локали с iso889 -5 (возможно ru _RU.ISO -8859 -5 есть другие языки с кириллицей):

$ echo "0JzQvtGB0LrQstCw" | base64 -d
ааОбаКаВаА

$ echo "0JzQvtGB0LrQstCw" | base64 -d | iconv -f utf8 -t iso8859-5
Москва
8
27.01.2020, 23:18

Теги

Похожие вопросы