Ham*_*igt 1 compression string encryption integer
给定一个随机整数,例如19357982357627685397198。如何将这些数字压缩为字符数较少的文本字符串?
文本字符串只能包含数字或字母字符(大写和小写)。
我尝试过声称可以压缩的 Base64 和 Huffman 编码,但在键盘上书写时,它们都没有使字符串更短。
我还尝试制作某种算法,尝试将整数除以数字“2,3,...,10”,并检查结果中的最后一个数字是否是它被除以的数字(在中查找 0)除以 10 的情况)。因此,解密时,只需将数字乘以整数中的最后一个数字即可。但这不起作用,因为在某些情况下,你不能除以任何东西,并且数字将保持不变,并且当它被解密时,它只会将其乘以比你开始时更大的数字。
我还尝试将整数分成从左开始的 2 个数字块,并给它们一个字母(a =1,b =2,o =15),当它到达z时,它只会回滚到a。这不起作用,因为当它被解密时,它不知道数字滚动了z多少次,因此比开始时的数字要小得多。
我还尝试了一些其他常见的加密策略。例如 Base32、Ascii85、Bifid Cipher、Baudot Code 以及其他一些我不记得了。
这似乎是一个无法解决的问题。但由于它以整数开头,因此每个数字可以包含 10 种不同的组合。在字母表中,字母可以包含 26 种不同的组合。这使得您可以用 5 个字母存储比用 5 位整数存储的数据更多的数据。因此,用数学方法可以在字符串中存储比整数更多的数据,但我只是找不到任何人曾经这样做过。
你从基数 10 切换到例如。以 62 为底,重复除以 62 并记录每一步的余数,如下所示:
Converting 6846532136 to base62:
Operation Result Remainder
6846532136 / 62 110427937 42
110427937 / 62 1781095 47
1781095 / 62 28727 21
28727 / 62 463 21
463 / 62 7 29
7 / 62 0 7
Run Code Online (Sandbox Code Playgroud)
然后,您使用余数作为您选择的 base62 字母表的索引,例如:
0 1 2 3 4 5 6
01234567890123456789012345678901234567890123456789012345678901
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
Giving: H (7) d (29) V (21) V (21) v (47) q (42) = HdVVvq
------
Run Code Online (Sandbox Code Playgroud)