我正在尝试进行vigenere密码攻击。我有一个密码长度未知的加密文本。我正在解决找到密钥长度的算法(我在块上分割文本,我在计算巧合指数)。 为了计算频率,我使用了哈希映射。但现在我有2维数组,毕竟我的地图是空的,帮我找到我的问题,谢谢:)尽管我得到了像{}这样的东西。 这是我的代码:
public static String count_coincidence (char[][] text){
int p=0;
HashMap<Character,Double> map = new HashMap<Character,Double>();
int a =(int)('а');
char[] dictionary = new char[32];
for(int x=0;x<dictionary.length;x++){
dictionary[x]=((char)(a+x));
}
for(int i=0;i<text.length;i++){
for(int j=0;j<text.length;j++){
for(int l=0;l<text.length;l++){
if(text[i][j]==dictionary[l]){
char c = text[i][j];
Double val = map.get(new Character(c));
if(val != null){
map.put(c, new Double( (val + 1) ) );
}
if(val==null){
map.put(c,1.0);
}
}
}
}
}
String d=map.toString();
return d;
}
在循环内的每次迭代之后,我应该保存map的值。
答案 0 :(得分:0)
您的循环索引都是错误的。你有:
for(int i=0;i<text.length;i++){
for(int j=0;j<text.length;j++){
for(int l=0;l<text.length;l++){
if(text[i][j]==dictionary[l]){
你想:
for(int i=0;i<text.length;i++){
for(int j=0;j<text[i].length;j++){
for(int l=0;l<dictionary.length;l++){
if(text[i][j]==dictionary[l]){
如果您打算迭代数组的整个内容,则需要确保索引达到要迭代的数组的大小。
text[i]
范围内的[0, text.length)
text[i][j]
范围内的[0, text[i].length)
dictionary[l]
范围内的[0, dictionary.length)