кодировка base64: ввод символов - PullRequest
2 голосов
/ 17 августа 2010

Я пытаюсь понять, каковы требования к входным данным для кодирования base64.У Николаса Закаса, к которому я испытываю огромное уважение, есть статья, в которой он цитирует спецификацию о том, что должна быть выдана ошибка, если на входе содержится какой-либо символ с кодом выше 255 Статья Закаса на base64

Прежде чем даже пытаться закодировать строку в base64, вы должны проверить, содержит ли строка только символы ASCII.Поскольку для кодирования base64 требуется восемь бит на входной символ, любой символ с кодом выше 255 не может быть точно представлен.В спецификации указывается, что в этом случае следует выдать ошибку:

if (/([^\u0000-\u00ff])/.test(text)){
        throw new Error("Can't base64 encode non-ASCII characters.");
    }

В другой отдельной части статьи он предоставляет ссылку на RFC 3548 , но я неНе вижу никаких входных требований, кроме:

Реализации ДОЛЖНЫ отклонять кодировку, если она содержит символы вне основного алфавита при интерпретации данных, закодированных в базовом коде, если в спецификации, ссылающейся на этот документ, не указано иное.

Не уверен, что означает "базовый алфавит", но, возможно, это то, о чем говорит Закас.Но, говоря, что они должны отказаться от кодирования, кажется, подразумевает, что это то, что уже закодированы в отличие от входа (если, конечно, вход недопустим он также будет отображаться в кодировке поэтому, возможно, точка является спорным).

Немного запутался в том, что такое стандарт.

Ответы [ 2 ]

8 голосов
/ 17 августа 2010

По сути, было бы ошибкой говорить о «base64 кодировании строки», где «строка» подразумевается в терминах text .

Кодировка Base64 применяется к двоичным данным (последовательность байтов или октетов, если вы хотите быть еще более разборчивыми), и результатом является текст. Каждый символ в выводе является печатным текстом ASCII. Суть base64 в том, чтобы обеспечить безопасный способ преобразования произвольных двоичных данных в текстовый формат, который может быть надежно встроен в другой текст, перенесен и т. Д. ASCII совместим практически со всеми наборами символов, поэтому вы вряд ли будете в состоянии это сделать кодировать текст ASCII как часть чего-то другого.

Когда кто-то говорит о «кодировании строки base64», он на самом деле говорит о кодировании текста в двоичном виде с использованием некоторой существующей кодировки (например, UTF-8), а затем применяет кодировку base64 к результату. Когда декодирует , вам нужно будет декодировать base64 обратно в двоичный файл, а затем декодировать эти двоичные данные с исходной кодировкой, чтобы получить исходный текст.

7 голосов
/ 17 августа 2010

Для меня (первая) связанная статья имеет фундаментальную проблему:

Прежде чем даже пытаться закодировать строку в base64, вы должны проверить, содержит ли строка только символы ASCII

Вы не кодируете base64 строк . Вы base64 кодируете последовательностей байтов . И когда вы имеете дело с любым видом кодирования, очень важно учитывать это различие.

Кроме того, его проверка на 'ASCII' фактически пропускает все от 80 до ff, которые не являются ASCII - ASCII только 00 до 7f.

Теперь, если у вас есть строка, которую вы проверили - это чистый ASCII, вы можете безопасно обрабатывать ее как последовательность байтов значений ASCII символов в ней - но это отдельный предыдущий шаг, ничего делать строго с актом кодирования base64.

(Я должен сказать, что я делаю , как и его неоднократное побуждение читателя отметить, что кодировка base64 не в любой форме или форме шифрование )

...