【问题标题】:How can I quickly compress a short hex string and decompress it in c#如何快速压缩一个短的十六进制字符串并在c#中解压它
【发布时间】:2013-04-18 08:29:30
【问题描述】:

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

B5A43BC5BDCEEFC6
2C7C27F05A488897
1514F4EC47C2EBF6
D91ED66BC999EB64

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

DeflateStream 和 GZipStream 只是增加长度。

谁能帮我把这 16 个字符的十六进制字符串缩短到 6 个字符或更少?

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

【问题讨论】:

    标签: hex base entropy information-theory


    【解决方案1】:

    除非在您的 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 个)大写 (或小写) 个大小写字符。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢。是的,它可以缩短我的字符串。但我需要缩短更多。
      猜你喜欢
      • 2017-03-21
      • 1970-01-01
      • 2020-11-11
      • 2010-12-31
      • 2012-07-31
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多