相关疑难解决方法(0)

为什么我们使用Base64?

维基百科

当需要编码需要通过设计用于处理文本数据的媒体存储和传输的二进制数据时,通常使用Base64编码方案.这是为了确保数据在运输过程中保持完好无需修改.

但是,数据是否总是以二进制形式存储/传输,因为我们的机器存储二进制文件的内存只取决于你如何解释它?因此,无论您编码位模式010011010110000101101110ManASCII或如TWFu为Base64,你最终将存储相同的位模式.

如果最终编码是零和1,并且每台机器和媒体都可以处理它们,那么如果数据表示为ASCII或Base64,这又如何重要?

什么是"旨在处理文本数据的媒体"?他们可以处理二元=>他们可以处理任何事情.


谢谢大家,我想我现在明白了.

当我们发送数据时,我们无法确定数据的解释格式是否与我们预期的相同.因此,我们发送以双方都理解的某种格式(如Base64)编码的数据.这样,即使发送方和接收方以不同方式解释相同的内容,但由于它们对编码格式达成一致,因此数据不会被错误地解释.

来自Mark Byers的例子

如果我想发送

Hello
world!
Run Code Online (Sandbox Code Playgroud)

一种方法是用ASCII发送它

72 101 108 108 111 10 119 111 114 108 100 33
Run Code Online (Sandbox Code Playgroud)

但是字节10可能无法正确解释为另一端的换行符.因此,我们使用ASCII的子集对此进行编码

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
Run Code Online (Sandbox Code Playgroud)

以相同数量的信息传输的更多数据为代价,确保接收器能够以预期的方式解码数据,即使接收器恰好对字符集的其余部分有不同的解释.

algorithm binary base64 ascii character-encoding

246
推荐指数
12
解决办法
8万
查看次数

如何将二进制数据转换为字符串并返回Java?

我在文件中有二进制数据,我可以读入字节数组并且没有任何问题.现在,我需要通过网络连接将部分数据作为XML文档中的元素发送.我的问题是,当我将数据从一个字节数组转换为一个字符串并返回一个字节数组时,数据就会被破坏.我已经在一台机器上对此进行了测试,以将问题与String转换隔离开来,所以我现在知道它不会被XML解析器或网络传输损坏.

我现在得到的是

byte[] buffer = ...; // read from file
// a few lines that prove I can process the data successfully
String element = new String(buffer);
byte[] newBuffer = element.getBytes();
// a few lines that try to process newBuffer and fail because it is not the same data anymore
Run Code Online (Sandbox Code Playgroud)

有谁知道如何将二进制转换为String并返回而不会丢失数据?

回答:谢谢Sam.我觉得自己像个白痴.我昨天得到了回答,因为我的SAX解析器在抱怨.出于某种原因,当我遇到这个看似独立的问题时,我并没有想到它是同一问题的新症状.

编辑:为了完整起见,我使用Apache Commons Codec包中的Base64类来解决这个问题.

java serialization

27
推荐指数
2
解决办法
9万
查看次数

在XML中编码二进制数据:是否有比base64更好的替代方案?

我想在XML文件中编码和解码二进制数据(使用Python,但无论如何).我必须面对XML标记内容具有非法字符的事实.XML规范中描述了唯一允许的:

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Run Code Online (Sandbox Code Playgroud)

这意味着不允许的是:

  • 29个Unicode控制字符是非法的(0x00 - 0x20)即(000xxxxx),除了0x09,0x0A,0x0D
  • 任何超过2个字节的Unicode字符表示(UTF-16 +)都是非法的(U + D800 - U + DFFF)即(11011xxx)
  • 特殊的Unicode非字符是非法的(0xFFFE - 0xFFFF)即(11111111 1111111x)
  • <,>,&根据这篇文章了解实体内容

1个字节可以编码256种可能.通过这些限制,第一个字节限制为256-29-8-1-3 = 215个可能性.

在第一个字节的215个可能性中,base64仅使用64个可能性.Base64产生33%的开销(一旦用base64编码,6位变为1字节).

所以我的问题很简单:是否有一种比base64更有效的算法来编码XML中的二进制数据?如果没有,我们应该从哪里开始创建它?(图书馆等)

注意:你不会回答这个帖子"你不应该使用XML来编码二进制数据,因为......".只是不要.您最多可以争论为什么不使用215种不良XML解析器支持的可能性.

NB2:我不是在谈论第二个字节,但是当我们使用补充的Unicode平面时,肯定会有一些关于可用性的因素以及它应该从10xxxxxx开始遵守UTF8标准的事实(如果不是,那么? ).

xml compression unicode utf-8 xml-serialization

8
推荐指数
2
解决办法
5450
查看次数

使用CDATA存储原始二进制流?

而不是将二进制文件保存为Base64的开销,我想知道你是否可以直接将双字节二进制流存储到XML文件中,使用CDATA,或者将其注释掉,或者什么?

xml binary base64 cdata

7
推荐指数
4
解决办法
1万
查看次数