我正在使用以下方法对给定文本进行编码。
static long encodeText(String text) {
long l = 31;
for (int i = 0; i < text.length(); i++) {
l = l * 47 + text.getBytes()[i] % 97;
}
return l;
}
当我将上述方法称为encodeText("stackoverflow")
时,请返回编码文本3818417496786881978
。
现在我想提供编码文本并获取String值。例如,如果我将3818417496786881978
提供给decodeText(long encoded)
,我需要输出stackoverflow
。
static String decodeText(long encoded) {
String str = null;
// decode steps here
return str;
}
我该怎么做?
答案 0 :(得分:0)
通过逻辑思考:明文&#34; stackoverflow&#34;当表示为7位ASCII时,表示13位7位(= 91位)的信息。这是多长(64位)可以容纳。因此,您的编码将丢失信息,使解码变得不可能。
根据您使用的公式,这也应该很明显:
l = l * 47 + text.getBytes()[i] % 97;
对于每个字符,你得到一个0到96之间的数字(你已经在模数中丢失信息,将信息减少到97个可能的字符(例如,你不能再在模数之后区分字节1和98)。然后你乘以你的长数小于97(47),所以两个连续的字符在密文中的信息分布方面会重叠。 最后,在添加更多字符之后,long只会溢出而最顶端的位丢失。
总之:如果你想再次解码密文,请修复这三个地方的信息丢失。