3

例如是否可以压缩

002e3483bbdc11ddaae0754822a559f6 变成最多只需要 30 个字符的东西。

4

3 回答 3

4

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

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

于 2013-02-08T15:03:03.800 回答
1

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

这不可能发生在所有测试用例中,因为如果可能的话,多个 32 长度的十六进制字符串必须压缩成相同的 30 长度的十六进制字符串,因此你不会知道它是哪一个(鸽笼原理)。

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

是我刚刚找到的一篇文章。维基百科说类似的话。

于 2013-02-08T15:19:54.653 回答
0

将十六进制转换为二进制,然后使用 base64 或任何其他编码方案,请参阅Binary-to-text encoding (Wikipedia)。这具有不需要像建议的 base32 解决方案那样的 128 位算术的优点。

转换为 base64 并返回:

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

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

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

于 2021-07-08T05:25:25.637 回答