Base64与HEX在XML doc中通过Internet发送二进制内容


73

在XML文档中的系统之间发送二进制内容的最佳方法是什么

我知道Base64和Hex,真正的区别是什么。我当前正在使用Base64,但为此需要包括一个外部公共库,就像使用HEX一样,我认为我可以创建一个函数。


因此,您要说的是,如果您具有此二进制数1110,则十六进制将为每个字节占用两个字符,因此从技术上讲,您会说AABBCCDD,然后将其作为十六进制值,但是在Base64中,它将采用三个字符AAABBBCCCDDD。这是查看它的技术方法吗?我确定AABBCCDD的十六进制值不是正确的数字。为什么某些哈希函数以略微不同的长度发送回值。例如,今天早上我有一个MD 5示例,我先后用A,B,然后C进行了测试,B哈希值比其他两个字符少一个字符。道格
道格豪夫2014年

Answers:


144

您也可以为Base64编写自己的方法...但是我通常建议同时使用外部的,经过测试的库。(这并不意味着它们短缺。)

Base64和十六进制之间的区别实际上只是字节的表示方式。十六进制是“ Base16”的另一种说法。十六进制每个字节占用两个字符-Base64每三个字节占用4个字符,因此它比十六进制效率更高。假设您使用UTF-8编码XML文档,则100K文件将需要200K进行十六进制编码,而在Base64中则需要133K。当然,很可能您根本不关心空间效率-在许多情况下都没有关系。如果确实如此,那么显然在这方面,Base64更好。(有些替代方法更有效,但并不常见。)


好吧,这是针对手机的,所以包括通用编解码器似乎有点过大,我可能只是走了十六进制路线,因为无论如何我都不会进行太多的编码/解码。
jax

7
@jax:我想说当设备上的空间(存储和内存)受到限制时,在移动设备上使用base64变得更加重要,网络带宽也受到限制。除非您只存储很小的文件(并且其中不很多),否则包括base64库可能会更好。(它不一定是通用编解码器-只是base64转换周围都有源文件。)
Jon Skeet 2010年

4
我要提到一个事实,即按位比较编码数据时,HEX编码值会保持其排序顺序,而base64则不会。这在某些情况下尤其重要,例如,当用于实现某些数据结构时。
马里奥

7
@Jon Skeet,更有效的替代方法有哪些?
enorl76

@Mario,您的评论没有任何意义。十六进制和Base64对字节的编码和解码完全相同。您如何在特定平台上将4字节的十六进制值读为32位整数是您的问题,具体取决于Big Endian或Little Endian
-ness

31

我很好奇,在EARTH base64上如何将3个输入字节转换为4个输出字节而仅增加33%的空间(而hex将1个输入字节转换为2个输出字节以实现100%的空间)。为什么要专门输入3个字节?

答案是:

3个字节= 3 x 8位= 24位。

为什么会有这个神奇的“ 24位”数字?好吧,基数64代表数字0到63。它们如何用二进制表示?用000000(0)至111111(63)。

答对了!每个base64字符使用单个输出字节(例如“ Z”等单个字符)代表6位输入数据。

因此,24位(3个完整的8位输入字节)/ 6位(base64字母)= 4个字节的base64。而已!

或者,用另一种方式描述,每个Base64字符(1个字节(8位))编码6位实际数据。而且,如果我们将8bits / 6bits除以,我们将看到33%的增长来自哪里,就像在这篇文章的顶部提到的那样。所以,是的,Base64总是将数据大小增加了33%(加上某些=字符的潜在填充) 在base64输出的末尾添加)。

您可能会想:“为什么在编码时,base128(输入的7位=输出的8位)仅以14%的大小增长?”。答案是,base64是我们能找到的最好的,因为较低的128个ASCII字符并非全部可打印。许多是控制字符,例如NULL等。

显然,有很多方法可以创建其他系统,例如“ base81”等,因为如果您创建自定义编码算法,则可以做任何您想做的事情。但是base64的优点在于,它如何以6位为块对数据进行如此干净的编码,以及如何简单地“读取3个字节并输出4个”来编码,以及“读取4个字节并输出3个”来解码。因此,该编码方案开始流行。

阅读本文后,希望您更加明智。

有趣的更新:说到具有更多字符的其他编码样式...引起我注意的是,Ascii85 aka Base85存在并且效率更高(当编码为Base85时,数据大小增长25%,而对于Base64则为33%):https:// /en.wikipedia.org/wiki/Ascii85


2
感谢您的文字Mitch。+1
阿伦

26

只有两个“真正的区别”:

  1. 基数。Base64是base-64,令人惊讶,十六进制是base-16。

  2. 编码:base-64将3个源字节编码为4个base-64字符(http://en.wikipedia.org/wiki/Base64#Examples);hex将1个字节编码为2个十六进制字符。

因此,base64比十六进制更紧凑。


答案有误。我已经提交了修改,但仍未完成。第2点应为:“ 2。编码:base-64将3个源字节编码为4个base-64字符(en.wikipedia.org/wiki/Base64#Examples;十六进制将1个字节编码为2个十六进制字符。”
罗伯托

17

其他答案明确了base16和base64之间的效率差异。

基础选择比效率更多。

Base64不仅使用字母和数字。不同的实现使用不同的标点符号来表示填充,并组成64个字符集的最后两个字符。这些字符可以包括加号“ +”和等于“ =”。两者在HTTP查询字符串中都是有问题的。

因此,支持base16而不是base64的一个原因是,可以将base16值直接组成HTTP查询字符串,而无需其他编码。这对您重要吗?

请注意,这是除效率之外的另一个问题。两种天生固有的好坏都没有。它们只是规模上的两个不同点,在这里您会发现在不同情况下或多或少具有吸引力的不同属性。

例如,考虑base32。它的效率比base64低20%,但仍然适合在HTTP查询字符串中使用。其效率低下的大部分原因是不区分大小写,并且避免了人类复制错误中的零“ 0”和一个“ 1”。

因此base32引入了新的关注点;易于人类繁殖。您担心吗?如果不是这样,则可以使用base62之类的东西,它在HTTP查询字符串中仍然很方便,但是区分大小写,并且包含零个“ 0”和“ 1”。

希望我已经澄清了,编码基础的选择只是沿着比例尺滑动,直到在获得对您重要的东西之前获得最佳效率为止。

维基百科上有很多有趣的数字系统


1
区分大小写是导致我选择base32或hex而不是base64的原因。谢谢你的提示!
小时制

6

尺寸对您来说重要吗?

Base64更加节省空间。使用4个字符表示3个字节,十六进制为每个字节使用2个字符。换句话说:十六进制将字符串的大小增加100%。对于适合作为url请求参数的小字符串,我不介意额外的成本/大小。

易用性对您来说重要吗?

十六进制比Base64更易于使用,因为在将字符串用作url请求中的get参数时+,您不需要转义(它可以包含=/)。

广泛使用对您来说重要吗?

我没有数字,但是根据一些因素,Base64可能比十六进制更能为一般开发人员所熟知。我早在十六进制(base16)之前就知道base64。


5

base64的开销较小(base64为原始数据的每3个字节产生4个字符,而hex为原始数据的每个字节产生2个字符)。十六进制更具可读性-您只需查看两个字符并立即知道后面的字节,但是使用base64时,您需要努力解码4个字符的组,因此使用十六进制将使调试更加容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.