Для чего используется кодировка base 64?

Я слышал, как люди говорят о «кодировке base 64» то тут, то там. Для чего это используется?

Из руководства для base64_encode (): «Эта кодировка разработана для того, чтобы двоичные данные пережили транспортировку через транспортные уровни, которые не являются 8-битными чистыми, такие как тела почты».

still_dreaming_1 28.02.2019 19:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
843
1
388 291
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Кодирование Base-64 - это способ преобразования двоичных данных в текст, чтобы его было легче передавать в таких вещах, как электронная почта и данные HTML-форм.

http://en.wikipedia.org/wiki/Base64

В основном я видел, как он используется для кодирования двоичных данных в контекстах, которые могут обрабатывать только ascii - или простые - наборы символов.

Он используется для преобразования произвольных двоичных данных в текст ASCII.

Например, таким образом отправляются вложения электронной почты.

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

По сути, каждые 6 битов ввода кодируются 64-символьным алфавитом. В "стандартном" алфавите используются A-Z, a-z, 0-9, + и /, с = в качестве символа заполнения. Есть URL-безопасные варианты.

Википедия - достаточно хороший источник дополнительной информации.

На таком языке, как php, будут исходить двоичные данные. Мы почти всегда работаем со строковыми данными, которые являются текстовыми.

Cholthi Paul Ttiopic 05.09.2016 17:02

@CholthiPaulTtiopic: результаты шифрования или сжатия звука / изображений / видео.

Jon Skeet 05.09.2016 17:07

что насчет хранилища, php, похоже, не имеет двоичного типа данных

Cholthi Paul Ttiopic 06.09.2016 06:26

@CholthiPaulTtiopic: Боюсь, я понятия не имею, что вы имеете в виду под «как насчет хранилища», но на данный момент я думаю, что мы несколько не по теме.

Jon Skeet 06.09.2016 08:39

Конечно, есть. Я предполагаю, что мне нужна была «двоичная строка», которая фактически оставалась двоичными данными с точки зрения внутреннего представления. Спасибо за ваше время.

Cholthi Paul Ttiopic 06.09.2016 10:28

@CholthiPaulTtiopic: Я бы категорически не хотел думать в терминах «двоичной строки». Двоичные данные следует рассматривать как двоичные данные, а нет - как текст. Я видел буквально сотни - возможно, тысячи - вопросов по SO, которые в основном сводятся к тому, что люди недостаточно заботятся об этом различии.

Jon Skeet 06.09.2016 10:29

@CholthiPaulTtiopic, вы просто работаете с ним как со строкой, и это нормально. Я не знаю, есть ли ошибки, на которые следует обратить внимание в результате работы с ним как с строкой, но я знаю, что PHP обычно извлекает двоичные данные как строку и передает ее как строку. Например, вы можете читать из двоичного файла и сохранять данные в другой путь к файлу, и это должно работать, насколько я знаю.

still_dreaming_1 28.02.2019 07:44

@ still_dreaming_1 PHP называет их binary strings. (источник) php.net/manual/en/function.pack.php

Cholthi Paul Ttiopic 28.02.2019 09:07

@CholthiPaulTtiopic В конечном итоге это просто строки, которые, как известно программисту, содержат двоичные данные. В информации сигнатуры метода, предоставленной для этой функции пакета, с которой вы связались, говорится, что она возвращает «строку», а не «двоичную строку». Я считаю, что pack () и unpack () нужны только в том случае, если вам нужно проанализировать или изменить двоичные данные.

still_dreaming_1 28.02.2019 18:29

Некоторые транспортные протоколы позволяют передавать только буквенно-цифровые символы. Только представьте себе ситуацию, когда управляющие символы используются для запуска специальных действий и / или которая поддерживает только ограниченную битовую ширину на символ. Base64 преобразует любой ввод в кодировку, которая использует только буквенно-цифровые символы, +, / и = в качестве символа заполнения.

Чтобы немного расширить то, что говорит Брэд: многие транспортные механизмы для электронной почты, Usenet и других способов перемещения данных не являются «8-битными чистыми», что означает, что символы вне стандартного набора символов ascii могут быть искажены при передаче - например, 0x0D можно рассматривать как возврат каретки и превращать в возврат каретки и перевод строки. Base 64 отображает все двоичные символы в несколько стандартных букв, цифр и знаков препинания ascii, поэтому они не будут искажены таким образом.

От http://en.wikipedia.org/wiki/Base64

The term Base64 refers to a specific MIME content transfer encoding. It is also used as a generic term for any similar encoding scheme that encodes binary data by treating it numerically and translating it into a base 64 representation. The particular choice of base is due to the history of character set encoding: one can choose a set of 64 characters that is both part of the subset common to most encodings, and also printable. This combination leaves the data unlikely to be modified in transit through systems, such as email, which were traditionally not 8-bit clean.

Base64 can be used in a variety of contexts:

  • Evolution and Thunderbird use Base64 to obfuscate e-mail passwords[1]
  • Base64 can be used to transmit and store text that might otherwise cause delimiter collision
  • Base64 is often used as a quick but insecure shortcut to obscure secrets without incurring the overhead of cryptographic key management

  • Spammers use Base64 to evade basic anti-spamming tools, which often do not decode Base64 and therefore cannot detect keywords in encoded messages.

  • Base64 is used to encode character strings in LDIF files
  • Base64 is sometimes used to embed binary data in an XML file, using a syntax similar to ...... e.g. Firefox's bookmarks.html.
  • Base64 is also used when communicating with government Fiscal Signature printing devices (usually, over serial or parallel ports) to minimize the delay when transferring receipt characters for signing.
  • Base64 is used to encode binary files such as images within scripts, to avoid depending on external files.
  • Can be used to embed raw image data into a CSS property such as background-image.
Ответ принят как подходящий

Когда у вас есть двоичные данные, которые вы хотите передать по сети, вы обычно не делаете это, просто передавая биты и байты по сети в необработанном формате. Почему? потому что некоторые носители предназначены для потоковой передачи текста. Вы никогда не знаете - некоторые протоколы могут интерпретировать ваши двоичные данные как управляющие символы (например, модем), или ваши двоичные данные могут быть испорчены, потому что базовый протокол может подумать, что вы ввели специальную комбинацию символов (например, как FTP переводит строку концовки).

Чтобы обойти это, люди кодируют двоичные данные в символы. Base64 - один из таких типов кодировок.

Почему 64?
Потому что вы обычно можете полагаться на одни и те же 64 символа, присутствующие во многих наборах символов, и можете быть достаточно уверены в том, что ваши данные окажутся на другом конце провода в целости и сохранности.

(Теоретически вы можете использовать кодировку base-80 или что-то подобное, но это будет значительно сложнее. Степень двойки является естественной базой для двоичного кода.)

Jon Skeet 14.10.2008 19:08

@yokees: Нет никаких гарантий, это просто персонажи, которые безопасны для почти всегда. Вот почему существует несколько форм Base-64 (en.wikipedia.org/wiki/Base-64).

user565869 12.01.2013 01:28

@Jon - какой вариант использует браузер, когда я помещаю Base64 в тег изображения?

employee-0 19.09.2013 16:22

Это лучшее обсуждение темы, которую я вижу; нет однозначного ответа, но я хотел бы спросить его именно здесь.

user565869 19.09.2013 19:02

Означает ли это, что при передаче всех данных сетевого типа должна использоваться какая-то кодировка?

Tanner Summers 09.08.2016 06:27

Но почему для кодирования строковых данных используется метод base64? например, в функции javascript atob. Имеется ли в виду, что сервер должен кодировать файл json в формат base64? Специальные символы могут быть вариантом использования, но почему в этом случае не использовать utf8, равнозначны ли они? Мы будем очень благодарны за любые дополнительные ресурсы по этому поводу.

partizanos 30.09.2016 18:33

Я предположил, что base 64 относится к системе счисления, а не к количеству символов в наборе. Нет?

Tom Russell 04.05.2017 07:11

@TomRussell: Base64 означает количество символов, используемых для кодирования. Теоретически вы можете представить одно число таким образом, используя эти 64 символа в качестве числа с основанием 64 вместо 10 символов, которые мы обычно используем для представления числа с основанием 10.

Dave Markle 04.05.2017 15:14

@DaveMarkle Приятно. Спасибо, что прояснили это для меня. Я бы перефразировал это как «использование подмножество из этих 64 символов ...»

Tom Russell 04.05.2017 20:05

@TomRussell - Я не уверен, откуда вы берете идею "подмножества". Термин «база-64» делает относится к системе счисления. В обычном десятичном формате (с основанием 10) у нас есть 10 различных символов. В шестнадцатеричной системе счисления (основание 16) у нас есть 16 различных символов. В двоичном формате у нас есть 2 разных символа. Итак, в base-64 у нас есть 64 различных символа. Итак, это действительно просто система счисления, точно такая же, как и в других системах счисления. Теперь, КАКИЕ 64 символа использовать - это совершенно другой вопрос, и в некоторых случаях вам нужно использовать другой набор из 64 символов, чем в других случаях.

John Y 03.08.2017 23:57

@John Y: Да, я не очень разбираюсь в системах счисления, поэтому мой комментарий, возможно, просто не имел смысла. Думаю, я придирился к тому, что числа почти всегда представлены чем-то меньшим, чем полный набор цифр в системе счисления. Например, 2334, состоящее из подмножества (2, 3, 4). РЖУ НЕ МОГУ.

Tom Russell 04.08.2017 12:20

Base-85 используется в некоторых системах, поскольку он может кодировать 32-битные фрагменты напрямую как пять символов. Он не только более компактен, чем base-64, но и объединяет 32-битные фрагменты. В отличие от этого, base-64 требует, чтобы данные, которые происходят в виде 32-битных блоков, были разделены на группы по четыре байта. а потом хватал группами по 3 байта.

supercat 14.09.2017 00:25

Если кто-то знает, было бы неплохо иметь список хотя бы некоторых протоколов, которые не работают.

Tadej 26.01.2018 15:41

Имеет ли смысл кодировать base-64 простой 7-битный текстовый файл ASCII?

stephanmg 18.04.2019 08:39

@stephanmg. В некоторых обстоятельствах может быть, да. ASCII содержит набор символов, которые некоторые протоколы могут интерпретировать как управляющие коды (например, NUL, DEL, BEL, LF). Другие кодировки (например, quoted-printable) могут быть здесь более эффективными, но Base64, безусловно, подойдет.

TRiG 28.11.2019 14:15

К вашему сведению, этот ответ цитируется в статье о css-трюках "Наверное, не base64 svg"

ashleedawg 06.10.2020 15:04

Это текстовое кодирование двоичных данных, в котором в результирующем тексте есть только буквы, цифры и символы «+», «/» и «=». Это удобный способ хранения / передачи двоичных данных через носитель, который специально используется для текстовых данных.

Но почему именно Base-64? На ум сразу приходят две альтернативы преобразования двоичных данных в текст:

  1. Десятичный: сохраните десятичное значение каждого байта в виде трех чисел: 045 112 101 037 и т. д., Где каждый байт представлен 3 байтами. Данные раздуваются в три раза.
  2. Шестнадцатеричный: храните байты в виде шестнадцатеричных пар: AC 47 0D 1A и т. д., Где каждый байт представлен двумя байтами. Данные раздуваются вдвое.

Base-64 отображает 3 байта (8 x 3 = 24 бита) в 4 символа, охватывающие 6 бит (6 x 4 = 24 бита). Результат выглядит примерно так: «TWFuIGlzIGRpc3Rpb ...». Следовательно, вздутие живота всего лишь в 4/3 = 1,3333333 раза больше исходного.

Правильно ли я понимаю, что 64 - лучший выбор, поскольку это наибольшая степень двойки, которая может быть преобразована в печатный символ ASCII (их 95)?

voho 18.01.2017 12:21

Если в обоих случаях они 24 бита, то разве раздувание не 1: 1? Или, когда вы говорите 4 символа, которые охватывают 6 бит, вы имеете в виду, что на самом деле на char есть 8 бит, но первые два - это заполненные нулями?

David Klempfner 27.02.2019 08:43

@Backwards_Dave Каждые 6 бит выражаются в 8 битах. Таким образом, вздутие живота составляет 8: 6 или 4: 3.

Ates Goral 27.02.2019 22:24

@AtesGoral Я прав в своем предположении, что когда вы используете Base256, вы можете сопоставить его 1: 1? потому что 1 байт = 8 бит = 256 возможных символов?

ChillaBee 08.01.2021 14:32

@ user2774480 В качестве мысленного эксперимента - да. Но вряд ли практичности в использовании Base256 нет.

Ates Goral 13.01.2021 23:06

На заре компьютеров, когда межсистемная связь по телефонной линии не была особенно надежной, использовался быстрый и грязный метод проверки целостности данных: «битовая четность». В этом методе каждый переданный байт будет иметь 7 бит данных, а 8-й будет равен 1 или 0, чтобы общее количество 1 бит в байте было четным.

Следовательно, 0x01 будет передаваться как 0x81; 0x02 будет 0x82; 0x03 останется 0x03 и т. д.

Для дальнейшего развития этой системы, когда был определен набор символов ASCII, только 00-7F были присвоены символы. (До сих пор все символы, установленные в диапазоне 80-FF, нестандартны)

Многие современные маршрутизаторы внедряют проверку четности и байтовую трансляцию в оборудование, заставляя подключенные к ним компьютеры работать строго с 7-битными данными. Это заставляет вложения электронной почты (и все другие данные, поэтому протоколы HTTP и SMTP основаны на тексте) преобразовывать в текстовый формат.

Немногие из маршрутизаторов дожили до 90-х годов. Я очень сомневаюсь, что кто-то из них сегодня используется.

Это отличный повод для обсуждения и интересный урок истории, спасибо.

Dan Bechard 05.06.2015 16:43

Но я думаю, что принятие 7-битного ASCII было в первую очередь вызвано форматами перфоленты, и его истоки лежат в телеграфии, а не в межкомпьютерной коммуникации.

Michael Kay 01.07.2020 23:41

Я использую его в практическом смысле, когда мы передаем большие двоичные объекты (изображения) через веб-службы. Поэтому, когда я тестирую веб-службу C# с помощью скрипта Python, бинарный объект можно воссоздать с помощью небольшого волшебства.

[В питоне]

import base64
imageAsBytes = base64.b64decode( dataFromWS )

Данные перемещаются быстрее?

FelipeM 07.12.2017 22:04

@FelipeM медленнее, а не быстрее. У Base64 накладные расходы 33% (по цене безопасности).

Juraj 05.06.2020 17:25

Помимо того, что уже было сказано, есть два очень распространенных использования, которые не были перечислены:

Хеши:

Хеши - это односторонние функции, которые преобразуют блок байтов в другой блок байтов фиксированного размера, например 128 или 256 бит (SHA / MD5). Преобразование полученных байтов в Base64 значительно упрощает отображение хэша, особенно когда вы сравниваете контрольную сумму на предмет целостности. Хеши так часто встречаются в Base64, что многие люди принимают сам Base64 за хеш.

Криптография:

Поскольку ключ шифрования не обязательно должен быть текстом, а должен быть необработанными байтами, иногда необходимо сохранить его в файле или базе данных, для чего удобно использовать Base64. То же самое с полученными зашифрованными байтами.

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

Сертификаты

Сертификаты x509 в формате PEM имеют кодировку base 64. http://how2ssl.com/articles/working_with_pem_files/

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

cHao 25.08.2012 09:51

Я никогда не видел хеша, записанного как 8-битные целые числа без знака, 0,1,255,36 ... и отображение его с помощью UTF-8 или любой другой кодировки не имело бы смысла, как еще вы бы отобразили его, кроме как с base64? Ключи шифрования и зашифрованные данные часто хранятся в файлах конфигурации и XML, где вы не можете хранить необработанные байты. Я согласен, если вы можете хранить его как необработанные байты, тогда непременно, но base64 предназначен для тех ситуаций, когда вы не можете. Base64 может использоваться не только для передачи. Это просто два распространенных сценария, в которых вы это увидите.

Despertar 25.08.2012 10:23

Вы бы отобразили хэш как шестнадцатеричный, а не десятичный. Для хешей это на самом деле гораздо более распространено, чем base64.

cHao 23.02.2014 13:51

@cHao Да, это тоже обычное дело. Шестнадцатеричные цифры могут представлять любые двоичные данные, но основание 64 имеет то преимущество, что занимает намного меньше места, поскольку использует больше символов.

Despertar 23.02.2014 23:43

У вас есть обратный размер SHA и MD5; SHA обычно (но не всегда) равен 256, а MD5 - 128.

The Daleks 11.06.2020 22:43

Base64

Base64 - это общий термин для ряда аналогичных схем кодирования, которые кодируют двоичные данные, обрабатывая их численно и переводя в представление base 64. Термин Base64 происходит от конкретной кодировки передачи содержимого MIME.

Схемы кодирования Base64 обычно используются, когда необходимо кодировать двоичные данные, которые необходимо хранить и передавать на носителях, предназначенных для работы с текстовыми данными. Это необходимо для того, чтобы данные оставались неизменными без изменений во время транспортировки. Base64 обычно используется в ряде приложений, включая электронную почту через MIME и хранение сложных данных в XML.

Base64 можно использовать для многих целей.

Основная причина - преобразовать двоичные данные во что-то сносное.

Иногда я использую его для передачи данных JSON с одного сайта на другой, хранения информации в файлах cookie о пользователе.

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

Вы слишком буквально интерпретируете определение «шифрование» далеко. Слово превратилось в нечто более конкретное, чем его происхождение.

Dan Bechard 05.06.2015 16:45

Использование Base64, которое я собираюсь здесь описать, является своего рода уловкой. Так что, если вам не нравятся хаки, пожалуйста, не продолжайте.

У меня возникли проблемы, когда я обнаружил, что MySQL utf8 не поддерживает 4-байтовые символы Unicode, поскольку он использует 3-байтовую версию utf8. Итак, что я сделал для поддержки полного 4-байтового юникода поверх MySQL utf8? Ну, base64 кодирует строки при сохранении в базу данных и base64 декодирует при извлечении.

Поскольку кодирование и декодирование base64 происходит очень быстро, вышеперечисленное сработало отлично.

Вы должны принять к сведению следующие моменты:

  • Кодировка Base64 использует на 33% больше памяти

  • Строки, хранящиеся в базе данных, не будут читаться человеком (вы можете продать это как функцию, в которой строки базы данных используют базовую форму шифрования).

Вы можете использовать описанный выше метод для любого механизма хранения, не поддерживающего Unicode.

«Вы можете продать это как функцию, в которой строки базы данных используют базовую форму шифрования». Мне нравится ваш стиль: D

Ercan 17.09.2015 20:51

«Вы могли бы продать это как функцию, заключающуюся в том, что строки базы данных используют базовую форму шифрования», что ужасно сказать: D

Alex 28.12.2016 17:17

основная форма шифрования от всех, у кого нет алгоритма декодирования base64 rofl: D

Eladian 09.10.2017 16:18

@Alex Совсем не то, чтобы сказать что-то ужасное. Конфиденциальные данные второй степени можно закодировать в формате base64, чтобы администраторы БД не могли их прочитать. Не всегда необходимо иметь наивысший уровень шифрования для каждой части данных. Например, если вы хотите скрыть «комментарии» от администратора БД, то для этой работы подойдет base64. Благодарности!

Basil Musa 27.01.2018 17:49

Стоит упомянуть, что MySQL теперь поддерживает весь Unicode, хотя в целях обратной совместимости их тип utf8 по-прежнему имеет только трехбайтовый формат; если вам нужна настоящая вещь, используйте utf8mb4. Хороший хак, но больше не нужен.

TRiG 03.04.2018 13:49

начиная с MySQL 5.6.1 SELECT FROM_BASE64('YmFzZTY0IGVuY29kZWQgc3RyaW5n');, создайте временную таблицу или представление, и вы можете прочитать эти "зашифрованные" комментарии = P

alo Malbarez 24.10.2018 23:15

Мне этот хак очень нравится. Собственно сам пользуюсь. Я так устал от плохих драйверов базы данных, которые не могут правильно обрабатывать utf-8. Итак, я делаю это: вместо select c from t я делаю select encode_as_base64(c) from t, а затем декодирую его в клиенте. Это уродливый хакер, но он работает даже с худшими драйверами odbc.

Juraj 05.06.2020 17:24

«Вы можете продать это как функцию, в которой строки базы данных используют базовую форму шифрования». Мне нравится ваш стиль :-)

Alexander 09.06.2020 07:56

«Схемы кодирования Base64 обычно используются, когда необходимо кодировать двоичные данные, которые необходимо хранить и передавать на носителях, предназначенных для работы с текстовыми данными. Это необходимо для того, чтобы данные оставались неизменными без изменений во время транспортировки »(Wiki, 2017).

Пример может быть следующим: у вас есть веб-сервис, который принимает только символы ASCII. Вы хотите сохранить, а затем перенести данные пользователя в другое место (API), но получатель хочет получить нетронутые данные. Base64 для этого. . . Единственным недостатком является то, что для кодирования base64 потребуется примерно на 33% больше места, чем для обычных строк.

Другой пример: uenc = url encoded = aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel-kayano-xii.html.

Как видите, мы не можем поместить символ «/» в URL-адрес, если мы хотим отправить последний посещенный URL-адрес в качестве параметра, потому что мы нарушим правило атрибута / значения для «MOD rewrite» - параметр GET.

Полный пример: «http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product/93/».

Много лет назад, когда была введена функция рассылки, которая была полностью основана на тексте, со временем возникла потребность во вложениях, таких как изображения и мультимедиа (аудио, видео и т. д.). Когда эти вложения отправляются через Интернет (в основном в виде двоичных данных), вероятность повреждения двоичных данных в необработанном виде высока. Итак, для решения этой проблемы появился BASE64.

Проблема с двоичными данными заключается в том, что они содержат нулевые символы, которые в некоторых языках, таких как C, C++, представляют собой конец символьной строки, поэтому отправка двоичных данных в необработанной форме, содержащей байты NULL, остановит полное чтение файла и приведет к повреждению данных.

Например :

В C и C++ этот «нулевой» символ показывает конец строки. Итак, «ПРИВЕТ» хранится так:

ПРИВЕТ

72 69 76 76 79 00

00 говорит «остановись здесь».

Теперь давайте рассмотрим, как работает кодирование BASE64.

На заметку: длина строки должна быть кратной 3.

Пример 1:

Кодируемая строка: «туз», длина = 3

1) Преобразуйте каждый символ в десятичный.

а = 97, с = 99, е = 101

2) Измените каждое десятичное число на 8-битное двоичное представление.

97 = 01100001, 99 = 01100011, 101 = 01100101

Комбинированный: 01100001 01100011 01100101

3) Разделить на группу по 6 бит.

011000 010110 001101 100101

4) Вычислить двоичное в десятичное

011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37

5) Преобразуйте десятичные символы в base64 с помощью диаграммы base64.

24 = Y, 22 = W, 13 = N, 37 = l

«Ace» => «YWNl»

Пример 2:

Кодируемая строка: «abcd» Длина = 4, она не кратна 3. Таким образом, чтобы сделать длину строки кратной 3, мы должны добавить 2-битное заполнение, чтобы длина была = 6. Бит заполнения представлен знаком «=».

Следует отметить: один бит заполнения равен двум нулям 00, поэтому два бита заполнения равны четырем нулям 0000.

Итак, приступим к процессу: -

1) Преобразуйте каждый символ в десятичный.

а = 97, б = 98, с = 99, г = 100

2) Измените каждое десятичное число на 8-битное двоичное представление.

97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100

3) Отдельно в группу по 6 бит.

011000, 010110, 001001, 100011, 011001, 00

поэтому последний 6 бит не является полным, поэтому мы вставляем два бита заполнения, которые равны четырем нулям «0000».

011000, 010110, 001001, 100011, 011001, 000000 ==

Теперь все равно. Два знака равенства в конце показывают, что были добавлены 4 нуля (помогает при декодировании).

4) Вычислить двоичное в десятичное.

011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 ==

5) Преобразуйте десятичные символы в base64 с помощью диаграммы base64.

24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==

«Abcd» => «YWJjZA ==»

это действительно отличное объяснение

maheshmnj 18.10.2019 08:23

Лучшее объяснение на данный момент

Naveen Raju 28.02.2021 11:36

Отличное объяснение

Rahul Srivastava 09.03.2021 09:11

Одна шестнадцатеричная цифра состоит из одного полубайта (4 бита). Два полубайта составляют 8 бит, которые также называются 1 байтом.

MD5 генерирует 128-битный вывод, который представлен последовательностью из 32 шестнадцатеричных цифр, которые, в свою очередь, составляют 32 * 4 = 128 бит. 128 бит составляют 16 байтов (поскольку 1 байт равен 8 битам).

Каждый символ Base64 кодирует 6 бит (за исключением последнего символа, не являющегося заполнителем, который может кодировать 2, 4 или 6 бит; и заключительных символов заполнения, если таковые имеются). Следовательно, для кодировки Base64 для 128-битного хеша требуется не менее ⌈128 / 6⌉ = 22 символа, плюс дополнение, если оно есть.

Используя base64, мы можем создать закодированный вывод желаемой длины (6, 8 или 10). Если мы выберем вывод длиной 8 символов, он будет занимать только 8 байтов, тогда как для 128-битного хеш-вывода он занимал 16 байтов.

Таким образом, в дополнение к безопасности, кодировка base64 также используется для уменьшения занимаемого пространства.

Другие вопросы по теме