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

jax*_*jax 56 java

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

我知道Base64和Hex,真正的区别是什么.我目前正在使用Base64,但需要包含一个外部公共库,因为我认为我可以创建一个函数.

Jon*_*eet 112

您也可以为Base64编写自己的方法......但我通常建议使用外部的,经过良好测试的库.(这不像是它们的短缺.)

Base64和hex之间的区别实际上就是字节的表示方式.Hex是另一种说"Base16"的方式.十六进制将为每个字节取两个字符--Base64每3个字节需要4个字符,因此它比十六进制更有效.假设您正在使用UTF-8对XML文档进行编码,那么100K文件将需要200K以十六进制编码,或者在Base64中编码为133K.当然,你可能不关心空间效率 - 在很多情况下它并不重要.如果它确实重要,那么显然Base64在这方面更好.(有些替代方案效率更高,但它们并不常见.)

  • @jax:我会说,当设备上的空间(存储和内存)受到限制时,在移动设备上使用base64会更加重要*,网络带宽也是如此.除非你只存储*非常小的*文件(而不是很多),否则你可能会更好地包括一个base64库.(它不一定是公共编解码器 - 有*just*base64转换的源文件.) (7认同)
  • @Jon Skeet,有哪些更有效的替代方案? (6认同)
  • 我要提到的事实是,当编码数据按比特进行比较时,HEX编码值保持其排序顺序,而base64则没有.这在某些情况下尤其重要,例如用于实现某些数据结构时. (4认同)
  • @algo:老实说,我不记得 11 年前我具体想到了什么。 (2认同)

use*_*421 21

只有两个"真正的差异":

  1. 基数.Base64是base-64,意外,而hex是base-16.

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

所以base64比hex更紧凑.


she*_*onh 17

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

基础选择比效率更多.

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

所以支持base16而不是base64的一个原因是base16值可以直接组成HTTP查询字符串而无需额外的编码.这对你很重要吗?

请注意,除了效率之外,这是一个额外的问题.基础本身都不是更好或更差; 它们只是规模上的两个不同点,在这些点上您会发现在不同情况下或多或少具有吸引力的不同属性.

例如,考虑base32.它的效率比base64低20%,但仍适用于HTTP查询字符串.它的大部分低效率来自于对案例不敏感并且避免零"0"和一"1",以及人类繁殖中的错误.

因此base32引入了一个新的关注点; 易于人类繁殖.这对你有用吗?如果不是,你可以选择类似base62的东西,它在HTTP查询字符串中仍然很方便,但是区分大小写,包括零"0"和"1".

希望我已经澄清过,选择你的编码基础是一个按比例滑动的问题,直到你在牺牲对你重要的事情之前获得最佳效率.

维基百科有一个有趣的数字系统列表.


Mit*_*ers 15

我很好奇EARTH base64如何将3个输入字节转换为4个输出字节,仅增加33%的空间增长(而十六进制将1个输入字节转换为2个输出字节,以实现100%的空间增长).为什么特意3个输入字节?

答案是:

3字节= 3 x 8位= 24位.

为什么那个神奇的"24位"号?好吧,base 64代表数字0到63.那些用二进制表示的是什么?用000000(0)到111111(63).

答对了!每个base64字符使用单个输出字节(单个字符,如"Z"等)表示6位输入数据.

所以24位(3个完整字节的输入)/ 6位(base64字母表)= 4个字节的base64.而已!

你可能会想"为什么不是base128(7位输入= 8位输出),编码时只有14%的大小增长?".答案是base64是我们能找到的最好的,因为较低的128个ASCII字符不是全部可打印的.许多是控制字符,如NULL等.

显然有很多方法可以创建其他系统,例如"base81"等,因为如果您创建自定义编码算法,您可以执行任何操作.但是base64的优点在于它如何以6位的块干净地编码数据.因此编码方案变得流行.

阅读本文后,现在你有希望更聪明了.


hfo*_*sli 7

尺寸对你很重要吗?

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

易用性对您来说重要吗?

Hex 比 Base64 更容易使用,因为在 url 请求中使用字符串作为 get 参数时不需要转义(它可能包含+, =and /)。

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

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


sha*_*oth 5

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