以下是我的问题陈述:
我得到一个64字节的字符串,只能包含数字[0-9]。
需要将字符串转换为20字节表示,并且还能够解码表示。
我想到的选项是将输入字符串(基本上是一个数字)转换为base64(或者可能更高)表示,这将减小大小。
但是C整数/双数据类型不允许这么大的数字来处理哪个是瓶颈。
我真的怀疑它是否有可能。如果我们不能将64字节转换为20字节,那么可以容纳20字节的最大数字是多少。
答案 0 :(得分:4)
我假设每个字节都是8位。
10^64
大于2^(20*8)
,因此它不适合。
粗略的指南是10位(1024个kombinations)可以存储3位数(1000)。
您有20 * 8 = 160位,因此您可以存储(略多于)48位数而不会丢失信息。
答案 1 :(得分:1)
如果每64个字符只有0到10的数字,则需要总共大约213位sup( log(2,10^64) )
,即27字节sup( 213/8 )
。
所以没有,无法压缩该数字,而不会丢失仅20字节,8位长的某种组合。
假设您可以使用 27字节,这样您就可以将您的数字拆分为3:123
,456
,并将它们写成二进制并连接二进制值。< / p>
您将使用27字节的完全21 blocks * 10 bits + 4 bits
(最后一位数字)。 sup( 214/8 ) = 27
PS。使用sup()我打算将舍入后的数字转换为下一个整数。
答案 2 :(得分:0)
粗略启发式是表示十进制数字的位数是3.3或3.3位〜= 1位。
大致如此
10 ^ 64~ = 211位〜= 26字节
和
20字节= 160位〜= 48位
因此这个问题是不可能的。
这是(信封的背面)接近Timmy报告的实际结果,可以很容易地“在头脑中”完成。
注意:数字我指的是10位数。