Почему Email / HTML-образ выбирают base64, а не base16 / 32/128/256? [Дубликат]

Вероятно, вы хотите использовать функцию na.locf() из пакета zoo , чтобы перенести последнее наблюдение вперед , чтобы заменить ваши значения NA.

Вот начало его примера использования на странице справки:

> example(na.locf)

na.lcf> az <- zoo(1:6)

na.lcf> bz <- zoo(c(2,NA,1,4,5,2))

na.lcf> na.locf(bz)
1 2 3 4 5 6 
2 2 1 4 5 2 

na.lcf> na.locf(bz, fromLast = TRUE)
1 2 3 4 5 6 
2 1 1 4 5 2 

na.lcf> cz <- zoo(c(NA,9,3,2,3,2))

na.lcf> na.locf(cz)
2 3 4 5 6 
9 3 2 3 2 

619
задан Slothworks 20 December 2015 в 10:48
поделиться

16 ответов

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

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

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

731
ответ дан illusionist 18 August 2018 в 12:32
поделиться
  • 1
    (Теоретически вы можете сделать кодировку base-80 или что-то подобное, но это будет значительно сложнее. Силы двух являются естественными основаниями для двоичных файлов.) – Jon Skeet 14 October 2008 в 16:08
  • 2
    @yokees: нет гарантии, они просто символы, которые почти всегда безопасны. Вот почему есть несколько форм Base-64 ( ru.wikipedia.org/wiki/Base-64 ). – user 11 January 2013 в 23:28
  • 3
    @Jon - какой вариант использует браузер, когда я помещал Base64 в тег изображения? – employee-0 19 September 2013 в 13:22
  • 4
    Означает ли это, что вся передача данных сетевого типа должна использовать какую-то кодировку? – Tanner Summers 9 August 2016 в 03:27
  • 5
    Но почему метод base64 используется для кодирования строковых данных? например, в функции javascript atob. Значит ли сервер кодировать json-файл в формат base64? Специальные символы могут быть прецедентом, но почему бы не использовать utf8 в этом случае, являются ли они равноценными? Любой дополнительный ресурс, касающийся этого, был бы благодарен вам. – partizanos 30 September 2016 в 15:33
  • 6
    – JedatKinports 26 January 2018 в 13:41

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

Термин Base64 относится к определенному кодированию передачи содержимого MIME. Он также используется в качестве общего термина для любой аналогичной схемы кодирования, которая кодирует двоичные данные, обрабатывая ее численно и переводя ее в представление базы 64. Конкретный выбор базы обусловлен историей кодирования набора символов: можно выбрать набор из 64 символов, который является частью подмножества, общего для большинства кодировок, а также для печати. Эта комбинация оставляет данные, которые вряд ли могут быть изменены при транзите через системы, такие как электронная почта, которые традиционно не были 8-битными.

Base64 может использоваться в различных контекстах:

  • Evolution и Thunderbird используют Base64 для обфускации паролей электронной почты [1]
  • Base64 может использоваться для передачи и хранения текста, который в противном случае мог бы вызвать столкновение с разделителем
  • Base64 часто используется как быстрый, но небезопасный ярлык для скрытия секретов, не прибегая к накладным расходам на управление криптографическими ключами
  • . Спамеры используют Base64 для обхода базовых средств защиты от спама, которые часто не декодируют Base64 и, следовательно, не могут обнаружить ключевые слова в закодированных сообщениях ,
  • Base64 используется для кодирования символьных строк в файлах LDIF
  • . Base64 иногда используется для встраивания двоичных данных в XML-файл с использованием синтаксиса, аналогичного ...... например. Закладки Firefox.html.
  • Base64 также используется при общении с государственными устройствами фискальной печати (обычно через последовательные или параллельные порты), чтобы минимизировать задержку при передаче символов чека для подписания.
  • Base64 используется для кодирования двоичных файлов, таких как изображения внутри скриптов, во избежание зависания внешних файлов.
  • Может использоваться для вставки необработанных данных изображения в свойство CSS, такое как фоновое изображение.
22
ответ дан Amal Murali 18 August 2018 в 12:32
поделиться

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

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

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

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

97
ответ дан Ates Goral 18 August 2018 в 12:32
поделиться
  • 1
    Правильно ли я понимаю, что 64 - лучший выбор, так как он является наивысшей степенью двух, которые могут быть конвертированы в печатный ASCII-символ (их 95)? – voho 18 January 2017 в 10:21
  • 2
    @voho Да, это правильно! – Ates Goral 18 January 2017 в 15:48

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

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

Так как кодировка и декодирование base64 очень быстрая, это отлично работает.

У вас есть следующие пункты: обратите внимание:

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

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

7
ответ дан Basil Musa 18 August 2018 в 12:32
поделиться
  • 1
    «Вы могли бы продать это как функцию, в которой строки базы данных используют базовую форму шифрования». Мне нравится ваш стиль: D – Ercan 17 September 2015 в 17:51
  • 2
    «Вы могли бы продать это как функцию, в которой строки базы данных используют базовую форму шифрования», что ужасно сказать: D – Alex 28 December 2016 в 15:17
  • 3
    базовая форма шифрования для всех, у кого нет алгоритма декодирования base64 rofl: D – Eladian 9 October 2017 в 13:18
  • 4
    @Alex Совсем нет «ужасной вещи, чтобы сказать». Данные, чувствительные к второй степени, могут быть закодированы в base64, чтобы сделать его нечитаемым администраторами db. Не всегда необходимо иметь самый высокий уровень шифрования для каждой части данных. Например, если вы хотите скрыть & quot; комментарии & quot; от администратора db, то base64 подходит для работы. Gratcias! – Basil Musa 27 January 2018 в 15:49
  • 5
    Стоит отметить, что MySQL теперь поддерживает все Unicode, хотя для обратной совместимости их тип utf8 по-прежнему остается только тремя байтами; если вы хотите настоящую вещь, используйте utf8mb4. Хороший взлом, но больше не нужен. – TRiG 3 April 2018 в 10:49

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

[В python]

import base64
imageAsBytes = base64.b64decode( dataFromWS )
6
ответ дан blasteralfred Ψ 18 August 2018 в 12:32
поделиться

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

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

103
ответ дан Brad Wilson 18 August 2018 в 12:32
поделиться

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

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

6
ответ дан Can Berk Güder 18 August 2018 в 12:32
поделиться

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

Хеши:

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

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

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

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

Сертификаты

x509 сертификаты в формате PEM кодируются базой 64. http://how2ssl.com/articles/working_with_pem_files/

63
ответ дан Despertar 18 August 2018 в 12:32
поделиться
  • 1
    На самом деле проще, обрабатывать, хранить байты в байтах во многих случаях. Даже в базе данных и особенно в файле (если используются записи фиксированной длины или байты являются единственным контентом). Base64 обычно используется, когда эти байты должны быть переданы где-то, особенно по каналу, который может уничтожать биты или интерпретировать некоторые байты в качестве управляющих кодов. – cHao 25 August 2012 в 06:51
  • 2
    Я никогда не видел хеш, записанный как unsigned 8-битные целые числа, 0,1,255,36 ... и отображение его с помощью UTF-8 или любой другой кодировки не имеет смысла, как иначе вы могли бы отобразить его, кроме как с base64? Ключи шифрования и зашифрованные данные часто хранятся в файлах конфигурации и XML, где вы не можете хранить необработанные байты. Я согласен, если вы можете сохранить его как необработанные байты, но, во всяком случае, base64 для тех ситуаций, когда вы не можете. Существует много применений base64 за пределами передачи. Это просто два распространенных сценария, где вы его увидите. – Despertar 25 August 2012 в 07:23
  • 3
    Вы будете отображать хеш как шестнадцатеричный, а не десятичный. Для хэшей это на самом деле гораздо чаще, чем base64. – cHao 23 February 2014 в 11:51
  • 4
    @cHao Да, это тоже распространено. Символы шестнадцатеричного кода могут представлять любые двоичные данные, но база 64 имеет то преимущество, что занимает гораздо меньше места, поскольку использует больше символов. – Despertar 23 February 2014 в 21:43

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

4
ответ дан Eric Tuttleman 18 August 2018 в 12:32
поделиться

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

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

Чтобы продолжить эту систему, когда был задан набор символов ASCII, назначены символы только 00-7F. (Сегодня все символы, заданные в диапазоне 80-FF, являются нестандартными)

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

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

18
ответ дан James Curran 18 August 2018 в 12:32
поделиться
  • 1
    Спасибо, это отличный момент для обсуждения и интересный урок истории. – Dan Bechard 5 June 2015 в 13:43

«Схемы кодирования 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/"

3
ответ дан jmr333 18 August 2018 в 12:32
поделиться

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

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

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

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

0
ответ дан Jody Fitzpatrick 18 August 2018 в 12:32
поделиться

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

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

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

174
ответ дан Jon Skeet 18 August 2018 в 12:32
поделиться
  • 1
    На языке, таком как php, будут получены двоичные данные. Мы почти всегда работаем со строковыми данными, которые являются текстом. – Cholthi Paul Ttiopic 5 September 2016 в 14:02
  • 2
    @CholthiPaulTtiopic: результаты шифрования или сжатия, а также звук / изображения / видео. – Jon Skeet 5 September 2016 в 14:07
  • 3
    что касается хранения, php, похоже, не имеет двоичного типа данных – Cholthi Paul Ttiopic 6 September 2016 в 03:26
  • 4
    @CholthiPaulTtiopic: Боюсь, я понятия не имею, что вы подразумеваете под «как насчет хранения»? но на данный момент я думаю, что мы немного не по теме. – Jon Skeet 6 September 2016 в 05:39
  • 5
    @CholthiPaulTtiopic: Я бы не стал думать о терминах «string binary». Двоичные данные следует рассматривать как двоичные данные, а not - как текст. Я видел буквально сотни, возможно, тысячи вопросов о SO, которые в основном сводятся к тому, что люди не уделяют достаточного внимания этому различию. – Jon Skeet 6 September 2016 в 07:29

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

9
ответ дан Konrad Rudolph 18 August 2018 в 12:32
поделиться

Base64

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

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

2
ответ дан mugil k 18 August 2018 в 12:32
поделиться

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

3
ответ дан Paul Tomblin 18 August 2018 в 12:32
поделиться
Другие вопросы по тегам:

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