【问题标题】:Decode encoded text with ASCII使用 ASCII 解码编码文本
【发布时间】:2014-07-21 13:18:14
【问题描述】:

我正在使用下面的方法来编码给定的文本。

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

现在我想提供编码文本并获取字符串值。例如,如果我将3818417496786881978 分配给decodeText(long encoded),我需要得到stackoverflow 的输出。

static String decodeText(long encoded) {
    String str = null;
    // decode steps here
    return str;
}

我该怎么做?

【问题讨论】:

  • 鉴于您当前的“编码”方案,这根本行不通。如果您想真正加密某些东西,请使用真正的加密 API。 (在不指定编码的情况下调用text.getBytes() 等还有其他问题......)
  • 编码的目的是什么?是加密吗?如果是,为什么不使用java支持的标准加密机制?
  • 问题是不能正确指定数字中的分隔符。如果所有文本都变成 2 位数字,那么它是可能的。如果它是可变长度的,那么它很有可能无法解码。
  • @JonSkeet 谢谢。那么无论如何我目前的编码方案都没有这样做吗?如果我打电话给text.getBytes("UTF-8")
  • 不-您的编码方法基本上太有损了。这是一种用于散列而不是加密的代码。

标签: java encoding ascii decode


【解决方案1】:

从逻辑上考虑:明文“stackoverflow”在表示为 7 位 ASCII 时表示 13 乘以 7 位(=91 位)的信息。那比 long(64 位)可以容纳的多。所以你的编码会丢失信息,无法解码。

从您使用的公式中也应该很明显:

l = l * 47 + text.getBytes()[i] % 97;

对于每个字符,您会得到一个介于 0 和 96 之间的数字(您已经丢失了模数中的信息,将信息减少到 97 个可能的字符(例如,您无法再区分模数后的字节 1 和 98)。然后您相乘您的 long 小于 97 (47),因此在密文中的信息分布方面,两个连续字符将重叠。 最后,在添加更多字符后,long 简单地溢出,最高位简单地丢失。

结论:如果您想再次解码密文,请修复这三个地方的信息丢失。

【讨论】:

  • 谢谢。我会试试这个:)
  • text.getBytes() 本身也可能有损。请使用text.getBytes("UTF-8")
猜你喜欢
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多