我可以在12个字符串中包含2位数(32位)[0-9a-z] {13}

时间:2013-03-19 00:20:20

标签: algorithm

我想将2个32位数字打包到12个字符串中 例  123 456 - > abcdef0000000

3 个答案:

答案 0 :(得分:4)

选择[0-9a-z]给出36个符号。有了12个这样的符号,你得到36 ^ 12 = 4.7e18个不同的字符串。

3个32位数字与一个96位数字相同,其中有2 ^ 96 = 7.9e28个不同的值。

你可以在12个位置上用这个字母表示更多的数字,所以不,你无法实现你想要的包装。

如果使用[0-9a-zA-Z],则有62个符号。 62 ^ 12 = 3.2e21 - 仍然很短。

给定多个符号S和字符串长度L,您可以通过求解S ^ L> = 2 ^ B来计算出可以存储的信息位数。对于你的情况,B = 96.让我们使用Base64字母表,所以S = 64(这也使数学更容易)。然后:

 64^L >= 2^96
 take log2 of both sides
 L * log2(64) >= 96 * log2(2)
 L * 6 >= 96
 L >= 16

因此,使用Base64字母表,您可以在16个符号中存储96位。

答案 1 :(得分:0)

假设你的意思是3个数字:

是否可以在字符串中获取它们取决于语言。但是,您不能对字符集有 ANY 限制。 32位数是4个字节,其中3个是12个字节。零是一种可能性 - 任何不允许你在字符串中存储零字节的语言都不允许这样做。但是,有些语言并不关心 - Delphi会浮现在脑海中。它存储带有长度代码而不是终结符的字符串,因此您可以将任何内容放入字符串中。

假设你的意思是2个数字:

[0-9] [A-Z]是36个符号。 36 ^ 6< 2 ^ 32,它将无法正常工作。

[0-9] [A-Z] [a-z]是62个符号。 62 ^ 6> 2 ^ 32,你可以做到。

另一方面,如果您正在谈论包含某些类型的宽字符的字符串,即使这三个数字也可以轻松打包,尽管您必须使用一些非ASCII字符来完成这项工作。选择任何256个符号,你就可以了。您甚至可以选择2048个符号(如果您查看东亚语言,您会找到更多符号)并将每个数字打包成三个字符。

答案 2 :(得分:0)

您实际上想要将3个4字节长度的数字压缩为一个12字节长度的字符串。是的,你可以这样做,但你必须使用所有256个ANSI符号(其中一些是不可打印的,如#13,#7,#10),它甚至不会是“包”,只是前4个字节将保存一个数字,第二个4字节将保存第二个数字,第三个4字节将保存第三个数字。

如果要将两个4字节数字打包成长度为12的READABLE(可打印)字符串,则需要能够将4个字节填充到字符串的6个“数字”中,幸好12个可以被2整除,并且你不必玩不均匀的包长度。因此,求解256 ^ 4< = X ^ 6,我们收到X为41,这意味着是的,如果你使用Base64字母表(如在以前的评论中那样),你就可以拥有这样的字符串。