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

时间:2014-03-20 11:56:54

标签: java checksum

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

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

 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();
}

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

1 个答案:

答案 0 :(得分:2)

如何将String写入文件?你必须非常小心地以与从文件中读回的方式相同的方式来做到这一点。

在你的情况下:

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编码。这很烦人......]