我有一些16个字符的十六进制字符串,像这样:
B5A43BC5BDCEEFC6
2C7C27F05A488897
1514F4EC47C2EBF6
D91ED66BC999EB64
我想缩短它们,并且缩短后的字符串只包含大写字母。
DeflateStream和GZipStream只是增加长度。
谁可以帮助我缩短这16个字符十六进制字符串6个字符或更少?
或者,将32个字符的十六进制字符串缩短为12个或更少的字符也是可以的。
除非在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个可能值。
-
在 6个(或更少)字符中可能做到这一点的唯一方法(假设没有冗余)是有一些基数,每个字符有1626可能的值。
1626^6 = 18480905552168525376≈1.849 × 10^19个可能值
根据同样的逻辑,将32个十六进制字符缩短为12个或更少的大写(或小写)大小写字符是不可能的。如果没有冗余,就不能保证将任意16(或32)个十六进制字符缩短为6(或12)个大写(或小写)大小写字符。
您可以将十六进制数转换为更高的进制数,如sexagesimal:
最快的方式转换一个基数10的数字到任何基础在。net ?