Base64与HEX在XML文档中通过互联网发送二进制内容
什么是在XML文档内的系统之间发送二进制内容的最佳方式
我知道Base64和Hex,真正的区别是什么。 我目前正在使用Base64,但需要包括一个外部公共库,这与hex,我想我可以创build一个函数。
你可以为Base64编写自己的方法,但是我通常会推荐使用经过充分testing的外部库。 (这不是他们的短缺。)
Base64和hex之间的区别实际上就是如何表示字节。 hex是另一种说“Base16”的方式。 hex每个字节需要两个字符 – Base64每3个字节需要4个字符,所以它比hex效率更高。 假设您使用UTF-8编码XML文档,一个100K文件将花费200K来编码hex,或在Base64 133K。 当然,这可能是你不关心空间效率 – 在许多情况下,这并不重要。 如果确实如此 ,那么在这方面显然Base64更好。 (还有更有效率的替代scheme,但并不常见。)
只有两个“真正的差异”:
-
基数。 Base64基本是64,惊喜,hex是基本16。
-
编码:base-64将3个源字节编码成4个基本64个字符( http://en.wikipedia.org/wiki/Base64#Examples ); hex将1字节编码为2个hex字符。
所以base64比hex更紧凑。
其他答案明确了base16和base64之间的效率差异。
基地select比效率更多。
Base64使用的不仅仅是字母和数字。 不同的实现使用不同的标点符号来表示填充,并且构成64位的最后两个字符。这些可以包括加“+”和相等的“=”。 在HTTP查询string中都有问题。
所以赞成base16 over base64的一个原因是base16的值可以直接编写成HTTP查询string而不需要额外的编码。 这对你很重要吗?
请注意,除了效率之外,这是一个额外的问题。 这两个基础本质上都不是好的也好, 他们只是两个不同的点,在这个点上你会发现不同的属性,在不同的情况下或多或less会有吸引力。
例如,考虑base32 。 它的效率比base64低20%,但仍然适用于HTTP查询string。 它的大部分低效率来自于不区分大小写,避免了零“0”和一个“1”,以避免人类繁殖的错误。
所以base32引入了一个新的问题。 便于人类繁殖。 这是你的担忧吗? 如果不是的话,你可以去找像base62这样的在HTTP查询string中仍然方便的东西,但区分大小写,包含零“0”和“1”。
希望我已经澄清过,select你的编码基础是一个滑动的问题,直到你在牺牲对你很重要的东西之前得到最好的效率。
维基百科有一个有趣的数字系统列表。
base64具有较less的开销(base64为原始数据的每3个字节生成4个字符,而hex则为原始数据的每个字节生成2个字符)。 hex更具可读性 – 只要查看两个字符,就能立即知道后面是什么字节,但使用base64则需要费力解码四个字符组,因此使用hex进行debugging将更容易。
大小对你重要吗?
Base64更节省空间。 使用4个字符表示3个字节,其中hex为每个字节使用2个字符。 换句话说:hex增加了100%的string的大小。 对于在url请求中作为参数的小string,我不介意额外的成本/大小。
对你来说易用性很重要吗?
Hex比Base64更容易使用,因为在URL请求中使用string作为get参数时,不需要转义(可能包含+
, =
和/
)。
广泛使用对你很重要吗?
我没有这些数字,但Base64可能比一般开发人员更了解取决于几个因素。 hex(base16)之前我就知道base64了。
我很好奇在EARTH base64上如何将3个input字节转换为4个输出字节,只有33%的空间增长(而hex将1个input字节转换为2个输出字节,以实现100%的空间增长)。 为什么特意input3个字节?
答案是:
3个字节= 3×8位= 24位。
为什么这个神奇的“24位”数字? 那么,基地64代表数字0到63.那些如何在二进制表示? 000000(0)至111111(63)。
答对了! 每个base64字符使用单个输出字节(单个字符,如“Z”等)表示6位input数据。
所以24位(3个字节的input)/ 6位(base64字母)= 4个字节的base64。 而已!
你可能会想:“为什么不base128(7位input= 8位输出),在编码时只有14%的增长?”。 答案是base64是我们能find的最好的,因为低128个ASCII字符不是全部可打印的。 许多是控制字符,如NULL等
有很明显的方法来创build其他系统,比如“base81”等,因为如果你创build一个自定义的编码algorithm,你可以做任何你想做的事情。 但base64的美妙之处在于它如何以6位块的forms完成数据编码。 所以编码scheme变得stream行。
现在,你已经阅读了这个希望更聪明。