java自定义密码加密/解密流
这是我在这里的第一个问题,所以如果你有任何我可以改进的地方(帖子和编码风格),我很高兴知道
我知道我的编码是非常高效的,所以我很乐意接受你的建议和改进
目前,我正在编写一个AtbashCipher
程序,它必须对输入String
进行加密和解密。和大学里的每一项任务一样,我们需要遵循一些指导原则,但我将首先解释我当前的代码:
导入java。util。扫描仪
public class AtbashCipher {
StringBuilder code = new StringBuilder("");
String inputString;
String coded;
public String getInputString() {
return this.inputString;
}
public void setInputString(String inputString) {
this.inputString = inputString;
}
public String getCoded() {
return this.coded;
}
public void setCoded(String coded) {
this.coded = coded;
}
public char encode(char c) {
String alphabet = "abcdefghijklmnopqrstuvwxyz";
char help = Character.toLowerCase(c);
if (alphabet.indexOf(help) >= 0) {
for (int i = 0; i < alphabet.length(); i++) {
if (help == alphabet.toLowerCase().charAt(i)) {
c = alphabet.charAt(26 - i - 1);
code.append(c);
}
}
} else {
code.append(c);
}
if (inputString.length() == code.length()) {
System.out.println("Encode: " + code);
coded = code.toString();
inputString = coded;
code.setLength(0);
}
return c;
}
public char decode(char c) {
String alphabet = "abcdefghijklmnopqrstuvwxyz";
char help = Character.toLowerCase(c);
if (alphabet.indexOf(help) >= 0) {
for (int i = 0; i < alphabet.length(); i++) {
if (help == alphabet.toLowerCase().charAt(i)) {
c = alphabet.charAt(26 - i - 1);
code.append(c);
}
}
} else {
code.append(c);
}
if (inputString.length() == code.length()) {
coded = code.toString();
inputString = coded;
System.out.println("Decode: " + code);
code.setLength(0);
}
return c;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
AtbashCipher atb = new AtbashCipher();
System.out.print("To be translated: ");
atb.setInputString(sc.nextLine());
sc.close();
for (int j = 0; j < atb.getInputString().length(); j++) {
char help = atb.getInputString().charAt(j);
atb.encode(help);
}
for (int k = 0; k < atb.getInputString().length(); k++) {
char help = atb.getInputString().charAt(k);
atb.decode(help);
}
}
}
这段代码对inputString进行加密和解密,这仍然需要替换为扫描仪输入,但这不是问题。 我们需要使用解码和编码的方法,这在我的代码中基本上是相同的,但我们还是需要拆分它。我做错什么了吗? (见编辑,是的,我做错了。)
问题从任务开始:
我们需要编写一个类AtbashWriter
来实现java.io.Writer
,然后构造函数需要获得以下参数:
public AtbashWriter(Writer base, AtbashCipher cipher)
此外,我们还需要重写Java给出的write
、flush
和close
方法
public void write(char[] cbuf, int off, int len)
public void flush()
public void close()
我们也需要为Reader
做同样的事情
我真的很难理解创建自己的Stream
并将其实现到代码中的概念
你能给我解释一下它是如何工作的,以及我的代码是如何更高效的吗?错误等等
请不要只是链接java库,因为我在理解库中的概念时有一些困难,我总是查阅一些示例
这项任务来自大学,但我在这方面没有任何成绩,我只想做它并为考试做练习
感谢您的帮助。 谢谢:)
编辑:我不能编辑我帖子的第一行,所以。。。嘿,伙计们。 Edit2:我刚刚看到我的方法没有完全按照我想要的方式运行,我会努力纠正它们。 编辑3:我编辑了这个节目,想在今天把作者发出去
Edit4:很晚了,但仍然没有忘记:我完成了它并把它添加到了这里,问题解决了:)
private Reader base;
private AtbashCipher cipher;
public AtbashReader(Reader base, AtbashCipher cipher) {
this.base = base;
this.cipher = cipher;
}
public int read (char[] cbuf, int off, int len) throws IOException{
int result= base.read(cbuf, off, len);
for(int i = off; i < (off+len); i++){
cbuf[i] = cipher.decode(cbuf[i]);
}
return result;
}
public void close()throws IOException {
base.close();
}
# 1 楼答案
我试着打个比方。假设你已经有了一台能够重新粉刷汽车的机器。很简单:你给它一辆车,机器给它喷漆。这台机器相当于
Writer
,它接受一个字符数组并将其写入现在的问题是,汽车在喷漆前需要清洗。那么,你怎么能制造一台洗车然后再喷漆的机器呢。你可以从头开始造一台新机器。或者你也可以建造一台重复使用喷漆机的机器。你的机器会取一辆车,清洗它(这是你的工作),然后把清洗过的车交给已经存在的机器。这台大机器就是你的
AtbashWriter
:它写字符数组,但在写它们之前,它对它们进行编码。它是如何做到的?通过对字符数组进行编码,然后将其传递给已经知道如何写入的机器:基本编写器因此,基本上,write()方法应该如下所示:
希望这能让你开始