假设n字节数组可以用十六进制表示为2 * n字符串,有没有办法用少于2 * n个字符表示n字节数组?
例如,通常,整数(int32)可以被视为4字节数据数组答案 0 :(得分:8)
hex的优点是将8位字节拆分为两个相等的一半是将字节映射到可打印ASCII字符所能做的最简单的事情。更有效的方法将多个字节视为块:
Base-64使用64个ASCII字符一次表示6位。每3个字节(即24位)被分成4个6位base-64位,其中“数字”为:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
(如果输入不是3个字节长的倍数,则第65个字符“=
”用于末尾的填充)。请注意,base-64的一些变体形式对最后两个“数字”使用不同的字符。
Ascii85是另一种表现形式,虽然知之甚少,但常用:它通常是在PostScript和PDF文件中编码二进制数据的方式。这将每4个字节(big-endian)视为无符号整数,在base 85中表示为5位数字,每个base-85数字编码为ASCII码33 + n(即“!
”对于0,最多为“u
”表示84) - 加上一个特殊情况,可以使用单个字符“z
”(而不是“!!!!!
”)表示4个零字节
(为什么85?因为84 5 < 2 32 < 85 5 。)
答案 1 :(得分:4)
是的,使用二进制(在这种情况下它需要n个字节,不足为奇),或使用任何高于16的基数,一个常见的基数为64。
答案 2 :(得分:2)
这可能取决于您要表示的确切数字。例如,如果使用素数表示的乘积(即“2 ^ 63”),则需要8字节以表示二进制的数字9223372036854775808在ascii中仅占用4个字节。
答案 3 :(得分:1)
base-64怎么样?
这完全取决于您愿意在编码中使用哪些字符(即表示)。
答案 4 :(得分:1)
Base64在每个字符中匹配6位,这意味着3个字节将适合4个字符。
答案 5 :(得分:1)
使用大约90000个定义的Unicode字符中的65536,您可以用N / 2个字符表示二进制字符串。
答案 6 :(得分:0)
是。使用的字符数不仅仅是0-9和a-f。单个字符(假设为8位)可以有256个值,因此您可以表示n个字符的n字节数。
如果需要打印,您可以选择一些字符来表示各种值。在这种情况下,一个很好的选择是base-64。