为什么此代码会加密除俄语字符之外的所有字符?
这里我搜索并替换字母表中的字符:
private void encrypting(Path sourcePath, Path resultPath, List<Character> alphabet, int key) {
try (FileChannel source = FileChannel.open(sourcePath, StandardOpenOption.READ);
FileChannel result = FileChannel.open(resultPath, StandardOpenOption.WRITE)) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (source.read(buffer) != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
byte b = buffer.get();
char c = (char) b;
int index = alphabet.indexOf(c);
if (index != -1) {
int newIndex = Math.floorMod(index + key, alphabet.size());
char encrypted = alphabet.get(newIndex);
result.write(ByteBuffer.wrap(new byte[]{(byte) encrypted}));
} else {
result.write(ByteBuffer.wrap(new byte[]{(byte) c}));
}
}
buffer.clear();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
这里将俄文字母添加到字母表中:
for (char i = 'А'; i <= 'Я'; i++) {
alphabet.add(i);
}
for (char i = 'а'; i <= 'я'; i++) {
alphabet.add(i);
}
需要加密的原始字符串:
Бородино Borodino 1234567890(),?>
加密结果:
Бородино%Gtwtinst%6789:;<=>5-.1ED
为什么此代码会加密除俄文字母之外的所有字符?
大多数情况下,俄语字母表的字母不是以一个字节存储在文件中,而是以多个字节存储在文件中。将字母表示为字节序列的规则称为编码。在现代世界中,最常见的编码是UTF-8。
但对于您和我们来说幸运的是,JRE 开发人员已经处理好了从字节到字母的转换以及反之亦然。这是通过实现抽象类
java.io.Reader
和的类来完成的java.io.Writer
。因此,您不应该在加密程序中使用文件通道并自行实现字节符号解码,而是使用标准库:
现在如何
Path
成为一名读者-作家:如何加密:
源文件
Бородино Borodino 1234567890
结果:Гртржкпр Dqtqfkpq 3456789АБ2
全班
Encrypt