java - 密码加密的基本算法不能按预期的字母数组工作
问题描述
所以,我有这个Java密码算法。我有一个字母数组:
char[] alphabet = {'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y'};
还有一个存储字符的表(基于输入)。考虑到我已经检查了很多次并且它完全按照预期存储字符,这并不那么重要。我下面是一个代码,以便字母数组中 Y 轴字母值上的每个字母在字母表的“轴”上向右移动 Y+1 次,如果超过 25 的值返回第一个值。这意味着如果“A”在 Y=0 处,它将从字母轴上的值 1 变为 2,这意味着“B”,而在 Y=2 处的“X”将值 24 更改为 27,并且因为超过 25 会变成 27-25=2, 'B'。为什么下面的代码为位于 X=0 Y=0 的字母“A”输出“Z”?
for(int p = 0; p < number; p++) {
for(int q = 0; q < number; q++) {
for(int r = 0; r < 26; r++) {
if(table[q][p] == alphabet[r]) {
table[q][p] = alphabet[(r+p+1)%26];
}
}
}
}
解决方案
当 X=0 和 Y=0 时,您添加的代码将为“A”生成字母“Z”。我假设 [q] 和 [p] 等于 0
问题就在这里:
if(table[q][p] == alphabet[r]) {
table[q][p] = alphabet[(r+p+1)%26];
}
如果 table[0][0] 持有“A”值,则当 r 变量等于 25 时,此条件为真。因为在您的字母数组中,“A”字母位于索引 25 下。那么:
table[q][p] = alphabet[(r+p+1)%26];
所以 table[0][0] 将等于 alphabet[(25+0+1)%26] 并且 26%26 为 0。
table[q][p] = alphabet[0]
哪个是数组中的“Z”字母。
更新:试试这个:
Character[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
Character[][] table = {{'a', 'b'}, {'c', 'd'}, {'e', 'f'}};
for (int x = 0; x < table.length; x++) {
for (int y = 0; y < table[x].length; y++) {
int index = Arrays.asList(alphabet).indexOf(table[x][y]);
table[x][y] = alphabet[(index + y + 1) % 26];
}
}
推荐阅读
- c++ - C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板特化
- java - 为对象创建运行除 toString 以外的方法的自定义 JList
- c# - 使用 Azure SDK for .Net ResourceManagementClient 进行身份验证
- youtube - youtube 应用程序中的 360 度视频卡顿
- arrays - Golang graphql用子图迭代地图
- python - 我可以在管理员之外使用 StreamField 编辑器吗?
- python - python:返回没有给定元素的列表的函数
- dynamics-crm - 工作流是否保证以先进先出的顺序执行?(CRM 2011 RU18 本地)
- node.js - 如何在反应构建中使用代理?
- vba - 使用 VBA Like 运算符比较两个变量中的值