我想知道是否有办法将20个左右的大数字(~10 ^ 8)压缩成合理长度的字符串。例如,如果数字存储为十六进制并连接,则长度至少为160个字符。我想知道是否有一种聪明的方法来压缩数字并让它们退出。我正在考虑将序列0-9作为参考,并让输入字符串的一部分为<1024的数字。该号码将被转换为二进制,用作掩码,即指示号码中存在哪些数字。现在还不清楚从哪里开始。
还有更好的选择吗?
由于
答案 0 :(得分:0)
如果这些大数字的字节数相同,并且您总是知道这些数字的数量,那么有一种简单的方法可以做到。你只需拥有一个字节数组,而不是将它们作为整数读出来,而是将它们作为字符读出来。您是在试图模糊您的价值观还是只是打包它们以便轻松转移?
答案 1 :(得分:0)
当我将很多值压缩成一个可逆的String
时,我通常会进行base 64
转换。这实际上可以从String
中截取相当多的长度,但请注意,在表示它时可能会占用相同的内存。
实施例
这个十进制数字:
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
是Base 64中的以下内容:
Yki8xQRRVqd403ldXJUT8Ungkh/A3Th2TMtNlpwLPYVgct2eE8MAn0bs4o/fv1bmo4oUNQa/9WtZ8gRE7IG+UHX+LniaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
为什么你不能做到这么太极端
想一想。假设你有一些长度10
。并且您希望使用5
个字符来表示该数字,因此需要50%
速率压缩方案。首先,我们计算出您可以使用10
数字代表多少个可能的数字..这是..
2^10 = 1024
好的,没关系。我们可以用5 digits
表达多少个数字:
2^5 = 32
因此,您只能使用5
位显示 32个不同的数字,而您可以使用1024
位显示10
个数字。要使压缩起作用,需要在压缩值和提取值之间进行一些映射。让我们试着让映射发生..
Normal - Compressed
0 0
1 1
2 2
.. ...
31 31
32 ??
33 ??
34 ??
... ...
1023 ??
大多数可以用扩展值表示的数字没有映射。
这称为Pigeonhole Principle,在此示例中,n
的值大于m
的值,因此我们需要将压缩值中的值映射到一个正常值,这使事情变得异常复杂。 (感谢Oli提醒我)。
答案 2 :(得分:0)
你需要更多地描述你的意思&#34; string&#34;和&#34; ~10 ^ 8&#34;。你的&#34;字符串&#34;包含任何字节序列?或者它是否仅限于可能的字节子集?如果是这样,它究竟是如何受到限制的?您&#34;大数字的限制是什么?#34;?它们代表什么?
最多10个 8 的数字可以用27位表示。如果允许任何字节序列,则它们中的20个将是540位,其可以存储在68字节的字符串中。如果字符串的内容有限,则需要更多位。如果您的数字范围较大,则需要更多位。
答案 3 :(得分:0)
当然,这取决于你的输入。但是有可能以这种方式构建(非常)紧凑的表示。