同步密码

时间:2016-05-08 14:42:32

标签: java replace

我正在创建一个简单地对字符串进行加扰的应用程序,并且可以将它重新组合在一起。它遵循一个简单的密码。我正在使用这样的代码:

String oldstr = "Hello"

String newstr = old.replace("e", "l").replace("l", "t");

我只是放了一点点,因为如果我把整个事情写出来,那就太大了。

关于问题。程序的工作方式,它首先用“l”替换“Hello”中的“e”,将字符串转换为“Hlllo”。然后用“t”替换“l”。但是,我不希望“e”最终成为“t”,因为那时我不能把它变成原来的。我希望这个应用程序工作的方式,结果将是“Hltto”。有没有办法可以同步应用程序,以便它可以这样做?

修改

我不是在寻找只适用于这种情况的答案(在我的实际应用中,我有26个字符被更改)。

3 个答案:

答案 0 :(得分:2)

密码应可逆

这意味着,所有操作都必须是可逆的。替换操作不是因为它将两个不同的字符映射到一个。 (你的'e'和'l'都映射到'l')

您必须构建一个表格,其中包含每个角色的内容,并根据该表格更改每个角色。例如:

  

a→...
  b→...
  c→...
  d→...
  e→l
  ...
  l→t
  ...

确保右侧没有重复项。

然后迭代字符串中的每个字符并构建一个新字符串。

StringBuilder sb = new StringBuilder(old.length());

for (char c : oldStr.toCharArray())
    sb.append( replaceChar(c) );

newStr = db.toString().

函数replaceChar(c)可以像查找表一样简单,或者为了更方便编码,可以是26项开关语句,或者(如真实加密中)依赖于键的数学函数。

另外,请注意大写和小写字母之间应该发生什么以及其他字符会发生什么(例如'à','ÿ','気',...)

答案 1 :(得分:1)

考虑使用Map处理字符串char-by-char进行替换:

// replacement map
static final Map<Character, Character> REPLACEMENTS = new HashMap<>();

// fill up replacements
static {
   for (String r : "el,lt,te,ab,ba".split(","))     // add all replacement pairs you need
       REPLACEMENTS.put(r.charAt(0), r.charAt(1));  // e→l, l→t, t→e, a→b, ...
}

// encoding method
static public String encode(String input) {
    StringBuilder sb = new StringBuilder();
    for (char c : input.toCharArray())
        sb.append(REPLACEMENTS.getOrDefault(c, c)); 
    return sb.toString();
}

要查看它是如何工作的,请致电:

System.out.println(encode("Hello"));   // Hltto

答案 2 :(得分:0)

一种方法可以实现的是具有二进制值的Bitmap / bitstring /数组。随便打电话给你。这样每个位代表一个字母。最初在加密之前,所有位都是0.然后当你改变一些字母时,你转到位数组并翻转相应的位。通过这种方式,您知道它已被更改,因此下一次传递将仅更改位数组中对应于0的字母。 或者您只需一次通过即可完成所有加密工作。

for (int i = 0; i < oldstring.length; i++) {
     switch (oldstring.charAt(i)) {
      .....
       .
       .
       .
      .....
      default: do nothing.
      }
}