如何将64字节字符串转换为20字节字符串?

时间:2016-04-19 09:45:42

标签: c encryption base64

以下是我的问题陈述:

  

我得到一个64字节的字符串,只能包含数字[0-9]。

     

需要将字符串转换为20字节表示,并且还能够解码表示。

我想到的选项是将输入字符串(基本上是一个数字)转换为base64(或者可能更高)表示,这将减小大小。

但是C整数/双数据类型不允许这么大的数字来处理哪个是瓶颈。

我真的怀疑它是否有可能。如果我们不能将64字节转换为20字节,那么可以容纳20字节的最大数字是多少。

3 个答案:

答案 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:123456,并将它们写成二进制并连接二进制值。< / 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位数。