C 如何将64字节字符串转换为20字节字符串?
以下是我的问题陈述: 我得到一个64字节的字符串,它只能包含数字[0-9] 需要将字符串转换为20字节的表示形式,并且能够对表示形式进行解码 我想到的选项是将输入字符串(基本上是一个数字)转换为base64(或更高的???)表示形式,这将减小大小 但C整数/双数据类型不允许处理如此大的数字,这是一个瓶颈C 如何将64字节字符串转换为20字节字符串?,c,encryption,base64,C,Encryption,Base64,以下是我的问题陈述: 我得到一个64字节的字符串,它只能包含数字[0-9] 需要将字符串转换为20字节的表示形式,并且能够对表示形式进行解码 我想到的选项是将输入字符串(基本上是一个数字)转换为base64(或更高的???)表示形式,这将减小大小 但C整数/双数据类型不允许处理如此大的数字,这是一个瓶颈 而且我真的怀疑这是否可能。如果我们不能将64字节转换为20字节,那么20字节的最大值是多少。我假设每个字节是8位 10^64大于2^(20*8)因此它实际上不适合 粗略地说,10位(1024个二
而且我真的怀疑这是否可能。如果我们不能将64字节转换为20字节,那么20字节的最大值是多少。我假设每个字节是8位
10^64
大于2^(20*8)
因此它实际上不适合
粗略地说,10位(1024个二进制)可以存储3位(1000)
您有20*8=160位,因此可以存储(略多于)48位而不会丢失信息。我假设每个字节是8位
10^64
大于2^(20*8)
因此它实际上不适合
粗略地说,10位(1024个二进制)可以存储3位(1000)
您有20*8=160位,因此可以在不丢失信息的情况下存储(略多于)48位。如果每64个字符中只有0到10个数字,则总共需要约213位
sup(log(2,10^64))
即27字节sup(213/8)
因此,不,您不能压缩该数字而不丢失一些仅20字节、8位长的组合
假设您可以使用27字节,这样您就可以将数字分成3块:123
,456
,并将它们以二进制形式写入并连接二进制值
您将总共使用27字节的21个块*10位+4位(最后一位)<代码>辅助(214/8)=27
注:对于sup(),我打算将整数舍入到下一个整数。如果每64个字符中只有0到10的数字,则总共需要213位sup(log(2,10^64))
即27字节sup(213/8)
因此,不,您不能压缩该数字而不丢失一些仅20字节、8位长的组合
假设您可以使用27字节,这样您就可以将数字分成3块:123
,456
,并将它们以二进制形式写入并连接二进制值
您将总共使用27字节的21个块*10位+4位(最后一位)<代码>辅助(214/8)=27
注:使用sup()我打算将整数舍入到下一个整数。一个粗略的启发式方法是表示十进制数字的位数为3.3或3.3位~=1位
因此大致
10^64~=211位~=26字节
和
20字节=160位~=48位
因此,这个问题是不可能的
这(信封的背面)与Timmy报告的实际结果非常接近,并且可以“在头脑中”轻松完成
注:我所说的数字是指以10位为基数。一个粗略的启发是,表示十进制数字的位数是3.3位或3.3位~=1位
因此大致
10^64~=211位~=26字节
和
20字节=160位~=48位
因此,这个问题是不可能的
这(信封的背面)与Timmy报告的实际结果非常接近,并且可以“在头脑中”轻松完成
注:数字是指以10位为基数的数字。因为它只能包含数字,并且有10个不同的数字,所以可以将字符串中的每个字符压缩为4位,因此可以将两个数字放入一个(无符号)字节中。因此,您将能够使用一个简单的朴素方法压缩到32字节。第四位和第八位保留了一点未使用的空间,因此您可以将其压缩,甚至更多。20字节是相当核心的。也许可以试试静态哈夫曼编码。这个任务没有任何意义。详细信息:在C语言中,字符串总是包含空字符,否则它不是字符串。因此,“只能包含数字[0-9]的64字节字符串”是不可能的。也许您指的是仅包含以空字符结尾的数字字符的64字节字符串?因为它只能包含数字,并且有10个不同的数字,您可以将字符串中的每个字符压缩为4位,因此您可以将两个数字放入一个(无符号)字节中。因此,您将能够使用一个简单的朴素方法压缩到32字节。第四位和第八位保留了一点未使用的空间,因此您可以将其压缩,甚至更多。20字节是相当核心的。也许可以试试静态哈夫曼编码。这个任务没有任何意义。详细信息:在C语言中,字符串总是包含空字符,否则它不是字符串。因此,“只能包含数字[0-9]的64字节字符串”是不可能的。也许您的意思是一个64字节的字符串,只包含以空字符结尾的数字字符?