0

我有一些像这样的 16 个字符的十六进制字符串:

B5A43BC5BDCEEFC6
2C7C27F05A488897
1514F4EC47C2EBF6
D91ED66BC999EB64

我想缩短它们并使缩短的字符串仅包含大写字母。

DeflateStream 和 GZipStream 只是增加了长度。

任何人都可以帮我将这 16 个字符的十六进制字符串缩短到 6 个字符或更少吗?

或者,可以将 32 个字符的十六进制字符串缩短为 12 个字符或更少。

4

2 回答 2

2

除非您的 16 位十六进制字符输入中有一些冗余,否则您所要求的在数学上是不可能的。您可以通过检查输入的熵来证明这一点。

  • 您有 16 个十六进制字符。

16^16 = 18446744073709551616 ≈ 1.84x10^19 个可能值。

  • 您希望字符串为 6 个大写(或小写 - 数学相同)大小写字符或更少。在英语中(我假设你想要英语)有 26 个大写字符。

26^6 = 308915776 ≈ 3.09x10^8 个可能的值。


  • 为保证您可以表示16 个十六进制字符中的一个,您需要14 个大写(或小写)字母。

  • 13 个字符是不够的:

26^13 = 2481152873203736575 ≈ 2.48x10^18 个可能值。

  • 14 个字符就足够了:

26^14 = 64509974703297150976 ≈ 6.45x10^19 个可能值。


  • 您可以在六个 (或更少)字符中做到这一点(假设没有冗余)的唯一方法是有一些基础,其中每个字符都有1626个可能的值。

1626^6 = 18480905552168525376 ≈ 1.849x10^19 个可能值。


通过相同的逻辑,将32 个十六进制字符缩短为 12 个或更少的大写(或小写)字符是不可能的。如果没有冗余,您无法保证可以将任意 16 个(或 32 个)十六进制字符缩短为 6 个(或 12 个)大写(或小写)字符。

于 2015-02-16T02:11:00.097 回答
0

您可以将十六进制数转换为更高的基数,例如六十进制:

将基数为 10 的数字转换为 .NET 中任何基数的最快方法?

于 2013-04-18T08:33:58.000 回答