首先我创建一个签名(byte []签名)。然后我将此签名写入文件。我从这个文件中读取了签名并给它另一个变量(byte [] signatureCopy)。但是当我比较这两个变量时,它返回false。我该如何解决?
但是当我打印屏幕时,它看起来是一样的。
System.out.println (new String (signature));
System.out.println (new String (signatureCopy));
代码:
byte[] signature = this.signature(data);
FileUtil.writeRegistryFileSigned(path, signature);
byte[] signatureCopy = FileUtil.readSignatureInRegistryFile(path);
System.out.println(Arrays.equals(signature, signatureCopy)); //FALSE
功能
public static byte[] readSignatureInRegistryFile(String filePath){
byte[] data = null;
try {
data = Files.readAllBytes(Paths.get(filePath));
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
public static void writeRegistryFileSigned(String filePath, byte[] signature) {
File fileRegistry = new File(filePath);
try {
fileRegistry.createNewFile();
} catch (IOException e1) {
}
try (FileWriter fw = new FileWriter(fileRegistry, true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw)) {
out.println(new String(signature));
} catch (IOException e) {
}
}
答案 0 :(得分:5)
您正在使用println编写,它将为字符串添加CR-LF或LF。
readAllBytes将真正读取所有字节,包括CR-LF或LF。
因此,虽然打印的字符串看起来相同,但数组不同。 (虽然,你应该注意额外的换行。)
此外:如果将字节转换为字符串,则某些编码生效,这可能会也可能不会产生您想要的内容。如果您的签名应该是字节数组,请不要将其转换为String进行打印,而是将字节值作为数值打印,以十六进制表示。