Bit*_*fin 5 java encryption obfuscation jvm hashmap
我目前正在为学校的家庭作业投掷一个混淆程序.我试图让程序读取一个文件,然后创建一个新文件,用一些相应的值替换文件中的每个字母HashMap
.我设置了一大堆键和值,但后来在编写新文件的过程中,我尝试在附加到新文件之前检查映射是否包含键String
.检查的字符实际上在我正在读取的文件中进行测试,并且文件被正确读取.然而它失败了encryptionDict.containsKey()
(我的hashmap)方法.
我希望一些Java专家可以帮我解决这个问题!我很无能,我更像是一个C和D家伙.令我印象深刻的唯一想法是,它会像Strings一样"foo" != "foo"
.但是字符不是对象.
代码在下面的pastebin中,要看的关键部分是类构造函数,方法加密和方法initDictionary
,也可以有人告诉我为什么HashMap<char, String>
无效,是因为我必须使用一个对象?
private HashMap<char [], String> initDictionary() {
HashMap<char [], String> d = new HashMap<char [], String>();
d.put("a".toCharArray(), "!\"#¤");
d.put("b".toCharArray(), "¤#\"!");
d.put("c".toCharArray(), "\"#¤%");
d.put("d".toCharArray(), "%¤#\"");
d.put("e".toCharArray(), "#¤%&");
d.put("f".toCharArray(), "&%¤#");
d.put("g".toCharArray(), "¤%&/");
d.put("h".toCharArray(), "/&%¤");
d.put("i".toCharArray(), "%&/(");
d.put("j".toCharArray(), "(/&%");
d.put("k".toCharArray(), "&/()");
d.put("l".toCharArray(), ")(/&");
d.put("m".toCharArray(), "/()=");
d.put("n".toCharArray(), "=)(/");
d.put("o".toCharArray(), "()=?");
d.put("p".toCharArray(), "?=)(");
d.put("q".toCharArray(), ")=?!");
d.put("r".toCharArray(), "!?=)");
d.put("s".toCharArray(), "=?!\"");
d.put("t".toCharArray(), "\"!?=");
d.put("u".toCharArray(), "?!\"#");
d.put("v".toCharArray(), "#\"!?");
d.put("w".toCharArray(), ";:*^");
d.put("x".toCharArray(), "^*:;");
d.put("y".toCharArray(), ":*^>");
d.put("z".toCharArray(), ">^*:");
// etc.
Run Code Online (Sandbox Code Playgroud)
这是有问题的一点.您不能在Java中使用数组作为散列键,因为Array不会覆盖equals()和hashCode()方法.
hashCode用于查找包含您要查找的对象的正确存储桶,equals()方法用于比较实际的对象.要使用HashMap,您需要以合理的方式覆盖这两个方法,而不能将数组类作为final.因此,如果您绝对坚持使用char数组,那么唯一可以做的就是使用包装类作为具有char数组的键.
像这样的东西:
public class Key {
private final char[] array;
public Key(final String string) {
this(string.toCharArray());
}
public Key(final char[] array) {
this.array = array;
}
public char[] getArray() {
return array;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Key key = (Key) o;
if (!Arrays.equals(array, key.array)) return false;
return true;
}
@Override
public int hashCode() {
return array != null ? Arrays.hashCode(array) : 0;
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以从a 或a中获得一个Map<Key, String>
和一个Key
对象String
char[]