-1

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

4

3 回答 3

4

选择 [0-9a-z] 给出 36 个符号。使用 12 个这样的符号,您将获得 36^12 = 4.7e18 个不同的字符串。

3 个 32 位数字与 1 个 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 字母表,您可以将 96 位存储在 16 个符号中。

于 2013-03-19T00:28:36.200 回答
0

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

如果你想将两个 4 字节的数字打包成一个长度为 12 的可读(可打印)字符串,你需要能够将 4 个字节填充到一个字符串的 6 个“数字”中,幸运的是 12 可以被 2 整除,而你不需要不必玩不均匀的包装长度。因此,解决 256^4 <= X^6,我们收到 X 为 41,这意味着是的,如果您使用 Base64 字母表(如对先前 andwer 的评论),您可以拥有这样的字符串。

于 2013-03-19T04:08:29.360 回答
0

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

是否可以在字符串中获取它们取决于语言。但是,您不能对字符集有任何限制。一个 32 位的数字是 4 个字节,其中三个是 12 个字节。零是一种可能性——任何不允许您在字符串中存储零字节的语言都不允许这样做。但是,有些语言并不在意——我想到了 Delphi。它存储带有长度代码而不是终止符的字符串,因此您可以将任何内容放入字符串中。

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

[0-9][AZ] 是 36 个符号。36^6 < 2^32,它不会工作。

[0-9][AZ][az] 是 62 个符号。62^6 > 2^32,你可以做到。

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

于 2013-03-19T01:07:37.907 回答