Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将64字节字符串转换为20字节字符串?_C_Encryption_Base64 - Fatal编程技术网

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

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字节的字符串,它只能包含数字[0-9]

需要将字符串转换为20字节的表示形式,并且能够对表示形式进行解码

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

但C整数/双数据类型不允许处理如此大的数字,这是一个瓶颈


而且我真的怀疑这是否可能。如果我们不能将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字节的字符串,只包含以空字符结尾的数字字符?