Двоичные данные в строке JSON. Что-то лучше, чем Base64

Все вышеприведенные ответы идеальны. Но на самом деле CMake использует CTest в качестве своих инструментов тестирования, поэтому стандартный метод (я думаю, что это) выполняет миссию:

enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)

Затем запустите cmake и создайте цели. После этого вы можете либо запустить make test, либо просто запустить

ctest

, вы получите результат. Это проверено в CMake 2.8.

Проверьте данные на: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing

561
задан Patrik 3 May 2017 в 11:41
поделиться

5 ответов

Есть 94 символа Unicode, которые могут быть представлены как один байт в соответствии со спецификацией JSON (если ваш JSON передается как UTF-8). С этим в мыслях, Я думаю, что лучшее, что вы можете сделать с точки зрения пространства, - это base85 , который представляет четыре байта как пять символов. Однако это всего лишь 7% улучшение по сравнению с base64, его вычисление дороже, а реализации реже, чем для base64, так что это, вероятно, не победа.

Вы также можете просто сопоставить каждый входной байт с соответствующим символом в U + 0000-U + 00FF, затем выполните минимальную кодировку, требуемую стандартом JSON для передачи этих символов; Преимущество здесь состоит в том, что требуемое декодирование равно нулю по сравнению со встроенными функциями, но эффективность использования пространства низка - расширение 105% (если все входные байты одинаково вероятны) против 25% для base85 или 33% для base64.

Окончательный вердикт: base64, на мой взгляд, выигрывает на том основании, что это обычное, легкое и неплохое достаточно , чтобы гарантировать замену.

См. Также: Base91

435
ответ дан 22 November 2019 в 22:07
поделиться

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

3
ответ дан 22 November 2019 в 22:07
поделиться

( Изменить 7 лет спустя: Google Gears больше нет. Игнорируйте этот ответ.)


Команда Google Gears столкнулась с проблемой нехватки двоичных данных. типов и попытался ее решить:

Blob API

JavaScript имеет встроенный тип данных для текстовых строк, но ничего для двоичных данных. Объект Blob пытается устранить это ограничение.

Может быть, вы сможете как-то это исправить.

4
ответ дан 22 November 2019 в 22:07
поделиться

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

__ setattr __ сложнее, потому что он всегда вызывается. Убедитесь, что вы используете вызов суперкласса или объект .__ setattr __ при установке собственных атрибутов; использование setattr () внутри __ setattr __ вызовет бесконечную рекурсию.

Последний бит, влияющий на isinstance, очень сложен. Вы можете сделать это путем присвоения переменной вашего экземпляра оболочки. __ class __ (но это также переопределяет порядок разрешения словаря классов) или путем динамического конструирования вашего типа оболочки с помощью метакласса. Поскольку isinstance так редко встречается в коде Python, файлы в [текст]. Это снижает накладные расходы по сравнению с предыдущими версиями на основе US-ASCII. методы кодирования с использованием 8-битного метода кодирования Extended ASCII. накладные расходы yEnc часто (если каждое значение байта появляется приблизительно с той же частотой в среднем) всего на 1-2% по сравнению с 33% –40% накладных расходов для 6-битных методов кодирования, таких как uuencode и Base64. ... К 2003 году yEnc стала де-факто стандартной системой кодирования для двоичных файлов в Usenet ».

Однако yEnc - это 8-битная кодировка, поэтому сохранение его в строке JSON имеет те же проблемы, что и сохранение исходных двоичных данных - наивный способ означает примерно 100% расширение, что хуже, чем base64.

17
ответ дан 22 November 2019 в 22:07
поделиться

Хотя верно, что base64 имеет скорость расширения ~ 33%, это не всегда верно, что накладные расходы на обработку значительно больше, чем это: это действительно зависит от JSON библиотеки / инструментария, который вы используете. Кодирование и декодирование - это простые прямые операции, и их можно даже оптимизировать с помощью кодировки символов (поскольку JSON поддерживает только UTF-8/16/32) - символы base64 всегда однобайтовые для записей JSON String. {{1} } Например, на платформе Java есть библиотеки, которые могут выполнять эту работу довольно эффективно, так что накладные расходы в основном связаны с увеличенным размером.

Я согласен с двумя предыдущими ответами:

  • base64 - это простой, широко используемый стандарт, поэтому вряд ли можно найти что-то лучше специально для использования с JSON (base-85 используется в postscript и т. Д., Но преимущества в лучшем случае незначительны если подумать)
  • сжатие перед кодированием (и после декодирования) может иметь большой смысл, в зависимости от используемых данных
8
ответ дан 22 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

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