而不是将二进制文件保存为Base64的开销,我想知道你是否可以直接将双字节二进制流存储到XML文件中,使用CDATA,或者将其注释掉,或者什么?
Nul字符(C中的'\ 0')在XML中的任何位置都无效,即使是转义().
不,你不能单独使用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中编码二进制数据,请单独传输