如何快速压缩短十六进制字符串并在c#中解压缩

时间:2013-04-18 08:29:30

标签: hex base entropy information-theory

我有16个字符的十六进制字符串,如下所示:

B5A43BC5BDCEEFC6
2C7C27F05A488897
1514F4EC47C2EBF6
D91ED66BC999EB64

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

DeflateStream和GZipStream只会增加长度。

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

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

2 个答案:

答案 0 :(得分:2)

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

  • 您有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个可能的值。


  • (或更少)字符中唯一可以做到的方法(假设没有冗余)是每个字符都有一些base 1626 可能的值。

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


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

答案 1 :(得分:0)

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

Quickest way to convert a base 10 number to any base in .NET?