Вместо накладных расходов на сохранение двоичного файла как Base64, мне было интересно, можно ли напрямую сохранить двухбайтовые двоичные потоки в файлы XML, используя CDATA, или комментируя это, или что-то в этом роде?
Использовать CDATA для хранения сырых двоичных потоков?
Ответы (4)
Вы можете сохранить его как CDATA, но есть риск, что некоторые последовательности байтов будут оцениваться как действительный XML, закрывающий раздел CDATA. После беглого просмотра http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect, похоже, у вас может быть любая последовательность символов, кроме "]]>". Посмотрите, что такое действительный XML-символ тоже.
Символ Nul ('\ 0' в C) недопустим нигде в XML, даже как escape (& # 0;).
Нет, вы не можете использовать только 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, которая является основной проблемой.
Решения:
- Используйте Base64 с 33% накладные расходы, но большая поддержка всех языков программирования и тот факт, что это стандарт
- Используйте BaseXML с ограниченными реализациями, но только с 20% накладными расходами
- По возможности не кодируйте двоичные данные в XML, передавайте их отдельно
XML - это простой текстовый формат - не используйте его для хранения двоичных данных. Поместите двоичные капли в отдельные файлы и добавьте в свой XML элемент, который ссылается на эти файлы. Если вы хотите хранить все двоичные капли в одном файле, добавьте атрибут смещения или что-то в этом роде ...