Использовать CDATA для хранения сырых двоичных потоков?

Вместо накладных расходов на сохранение двоичного файла как Base64, мне было интересно, можно ли напрямую сохранить двухбайтовые двоичные потоки в файлы XML, используя CDATA, или комментируя это, или что-то в этом роде?


person Robin Rodricks    schedule 02.02.2009    source источник


Ответы (4)


Вы можете сохранить его как CDATA, но есть риск, что некоторые последовательности байтов будут оцениваться как действительный XML, закрывающий раздел CDATA. После беглого просмотра http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect, похоже, у вас может быть любая последовательность символов, кроме "]]>". Посмотрите, что такое действительный XML-символ тоже.

person Joao da Silva    schedule 02.02.2009
comment
Разве это не означает, что вы не можете, поскольку 0-8, B, C, E, F FFFE и FFFF - недопустимые символы? - person David Sykes; 28.04.2010
comment
Голосование против, потому что существует много последовательностей байтов, которые не будут сохранены. Под отказом от сохранения я подразумеваю, что невозможно восстановить исходные двоичные данные из данных в кодировке CDATA. См. Ответ и комментарии Пита. - person rwong; 29.05.2013

Символ Nul ('\ 0' в C) недопустим нигде в XML, даже как escape (& # 0;).

person Pete Kirkham    schedule 02.02.2009
comment
Я полагаю, потому что файлы XML заканчиваются нулем. - person Robin Rodricks; 02.02.2009
comment
@ Джереми: Нет. Null просто недопустимый символ XML, вероятно, из-за строк с завершающим нулем в популярном языке программирования ... - person Christoph; 02.02.2009
comment
Обратите внимание, что в стандарте это не ясно на 100%. Определения диапазона символов исключают байт 0, но в некоторых других текстах говорится, что любой символ ниже 127 является допустимым. - person Aaron Digulla; 02.02.2009
comment
Также возврат каретки заменяется в XML CDATA. stackoverflow.com/questions/1437874/ - person rwong; 29.05.2013
comment
@rwong они сохраняются, если экранированные, но вы не можете сделать это с помощью nul. - person Pete Kirkham; 30.05.2013

Нет, вы не можете использовать только CDATA для вставки двоичных данных в файл XML.

В XML1.0 (поскольку XML 1.1 более разрешительный, но не в отношении управляющих символов) следующие ограничения применяются к символам CDATA:

CData      ::=      (Char* - (Char* ']]>' Char*)) 
Char       ::=      #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

Это означает, что есть несколько недопустимых символов, среди них:

  • недопустимые управляющие символы XML от 0x00 до 0x20, кроме новых строк, возврата каретки и табуляции
  • недопустимые последовательности UTF-8, такие как 0xFF или неканонические 0b1100000x 0b10xxxxxx

Кроме того, в стандартном содержимом сущности без CDATA:

  • Использование "‹ "и"> "незаконно
  • Использование "&" ограничено (é в порядке, &zajdalkdza; - нет)

Таким образом, CDATA - это просто способ разрешить "‹ ","> "и" & ", ограничив вместо этого"]]> ". Это не решает проблему с недопустимыми символами XML, Unicode и UTF-8, которая является основной проблемой.

Решения:

  1. Используйте Base64 с 33% накладные расходы, но большая поддержка всех языков программирования и тот факт, что это стандарт
  2. Используйте BaseXML с ограниченными реализациями, но только с 20% накладными расходами
  3. По возможности не кодируйте двоичные данные в XML, передавайте их отдельно
person KrisWebDev    schedule 05.07.2013

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

person Christoph    schedule 02.02.2009
comment
Да, и как именно Flash должен подключаться к необработанным двоичным файлам и читать их? (Только ActionScript 2) - person Robin Rodricks; 02.02.2009
comment
Не говорите мне ByteArray или URLLoader. Это только AS2. - person Robin Rodricks; 02.02.2009
comment
@ Джереми: и где именно вы это сказали в своем вопросе? - person Christoph; 02.02.2009
comment
Я не сделал этого, потому что хотел открыто рассказать об AS2 / AS3, так что надеюсь получить больше ответов. - person Robin Rodricks; 02.02.2009