是否有可能将32个十六进制数字无损压缩为30?

时间:2013-02-08 14:30:15

标签: compression hex

例如可以压缩

002e3483bbdc11ddaae0754822a559f6,最多可包含30个字符。

3 个答案:

答案 0 :(得分:4)

是的,您可以将其转换为32位数字,因此最大的32个字符十六进制数字即ffffffffffffffffffffffffffffffffff相当于基数为32的80000000000000000000000000只有26个字符,另请注意,在base-32中,您将以仅包含此字符的字符串:123456789ABCDEFGHIJKLMNOPQRSTUV

例如:002e3483bbdc11ddaae0754822a559f6在base-32中是5OQ87EUS27F0000000000000

答案 1 :(得分:1)

如果您的问题是将32个十六进制数字压缩为30个十六进制数字。

对于所有测试用例都不可能发生这种情况,因为如果可能的话,多个32长度的十六进制字符串必须压缩到相同的30长度十六进制字符串,因此您不会知道它是哪一个( the pigeonhole principle)。

证明不足的证据 - 您可以在任何大小的文件上重复调用该过程,以获得单个30长度的十六进制字符串,这没有多大意义。

Here是我刚发现的一篇文章。 Wikipedia说了类似的话。

答案 2 :(得分:0)

将十六进制转换为二进制,然后使用类似 base64 或任何其他编码方案的内容,请参阅 Binary-to-text encoding(维基百科)。这样做的优点是不需要像建议的 base32 解决方案那样使用 128 位算法。

转换为 base64 并返回:

$ echo 002e3483bbdc11ddaae0754822a559f6 |xxd -r -ps |openssl base64 -e |tee >(openssl base64 -d |xxd -ps)
AC40g7vcEd2q4HVIIqVZ9g==
002e3483bbdc11ddaae0754822a559f6

剪切从 |tee 开始的行以仅获取编码输出。在大多数编程语言中,您将拥有核心或外部库来进行十六进制到二进制的转换和 base64 编码。

注意:也可以转换为 base32,但 base32 二进制到文本编码需要 8 字节填充,因此您必须修剪它,然后在解码时重新添加填充 (=)。