gpt4 book ai didi

java - 当计算的字符串包含重音字符时,校验和不匹配

转载 作者:行者123 更新时间:2023-12-02 06:02:54 24 4
gpt4 key购买 nike

首先:我有一个包含重音字符的字符串。

第二:我计算它的校验和。

 private static String checkSumInStream(String Str, String checksumAlgorithm) throws Exception
{
InputStream stream = new ByteArrayInputStream(Str.getBytes());
MessageDigest digest = MessageDigest.getInstance(checksumAlgorithm);

InputStream input = null;
StringBuffer sb = new StringBuffer();
try{
input = stream;
byte[] buffer = new byte[8192];
do {
int read = input.read(buffer);
if(read <= 0)
break;
digest.update(buffer, 0, read);
} while(true);
byte[] sum = digest.digest();

for (int i = 0; i < sum.length; i++) {
sb.append(Integer.toString((sum[i] & 0xff) + 0x100, 16).substring(1));
}

}catch(IOException io)
{

}finally{
if(input != null)
input.close();
}

return sb.toString();
}

然后我将字符串写入文本文件,然后重新计算文件的校验和

private String checkSum(File file,String checksumAlgorithm) throws Exception 
{
MessageDigest digest = MessageDigest.getInstance(checksumAlgorithm);
InputStream input = null;
input = new FileInputStream(file);
byte[] buffer = new byte[8192];
do {
int read = input.read(buffer);
if(read <= 0)
break;
digest.update(buffer, 0, read);
} while(true);
input.close();
byte[] sum = digest.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < sum.length; i++) {
sb.append(Integer.toString((sum[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}

--> 结果:当文本包含重音字符时,输出流和文件的校验和之间的比较不匹配。

最佳答案

如何将字符串写入文件?您必须非常小心地以与从文件中读回它的方式相同的方式进行操作。

就您而言:

OutputStream out = new FileOutputStream(myfile);
out.write(str.getBytes());
out.close();

然后它应该可以工作。但您需要记住,在写入文件时,str.getBytes() 并不是一种安全的方法,因为它使用平台默认的字符编码。如果您将这样的文件发送到其他地方并在那里使用它,您可能会使用错误的编码读回它。

而且您的平台默认编码甚至可能不支持重音字符! (但是如果您以完全相同的方式写入和读取文件,那么您应该得到完全相同的结果,因此这不会是问题的原因)

最好的办法是使用 UTF-8 字符编码。无论您在何处使用 str.getBytes(),请将其替换为 str.getBytes("UTF-8")str.getBytes(Charset.forName( "UTF-8")) 如果您想避免捕获 UnsupportedEncodingException [即使每个 Java 实现都需要支持 UTF-8 编码。真烦人……]

关于java - 当计算的字符串包含重音字符时,校验和不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22532217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com