java - 消化 md5 抛出 UTF8 错误 - Java

标签 java

我正在消化其他一些 zip 文件的内容以生成 MD5。文件内容被摘要并生成 MD5,而不是例如基于时间戳生成 MD5。因此,我断言两个文件具有相同的内容,即使它们是在不同时间生成的。因此,我编写了以下 Java 方法:

    public String digest( ZipInputStream entry ) throws IOException{

        byte[] digest = null;
        MessageDigest md5 = null;
        String mdEnc = "";
        try {
            md5 = MessageDigest.getInstance( "MD5" );

            ZipEntry current;
            if( entry != null ) {
                while(( current = entry.getNextEntry() ) != null ) {
                    if( current.isDirectory() ) {
                        digest = this.encodeUTF8( current.getName() );
                        md5.update( digest );
                    }
                    else{
                        int size = ( int )current.getSize();
                        if(size > 0){
                            digest = new byte[ size ];
                            entry.read( digest, 0, size );
                            md5.update( digest );
                        }
                    }
                }
                digest = md5.digest();
                mdEnc = new BigInteger( 1, md5.digest() ).toString( 16 );
                entry.close();
            }
        }
        catch ( NoSuchAlgorithmException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return mdEnc;
    }

         public byte[] encodeUTF8( String name ) {
             final Charset UTF8_CHARSET = Charset.forName( "UTF-8" );
                 return name.getBytes( UTF8_CHARSET );
         }

该方法工作正常,直到我得到了具有中文韩语日语编码的zip文件(不仅仅是传统的UTF-8):

Processing :mrl_l10n.zip
MD5 A: d41d8cd98f00b204e9800998ecf8427e
MD5 B: d41d8cd98f00b204e9800998ecf8427e
They Match
Processing :fcm.zip
MD5 A: d41d8cd98f00b204e9800998ecf8427e
MD5 B: d41d8cd98f00b204e9800998ecf8427e
They Match
Processing :1_mrm_root.zip
Exception in thread "main" java.lang.IllegalArgumentException
    at java.util.zip.ZipInputStream.getUTF8String(Unknown Source)
    at java.util.zip.ZipInputStream.getFileName(Unknown Source)
    at java.util.zip.ZipInputStream.readLOC(Unknown Source)
    at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
    at Tczip.digest(Tczip.java:98)
    at Tczip.execute(Tczip.java:33)

有人知道如何为此创建解决方法吗?

最佳答案

使用 Java 7,它有一个新的 API - new ZipInputStream(InputStream, Charset),允许您设置条目名称的字符集。

关于java - 消化 md5 抛出 UTF8 错误 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038321/

相关文章:

java - Spring:在 Junit 中加载的类中 Autowiring 不同的类

java - 如何使用带有 EPL 的 Zebra 打印机打印双引号?

java - 使用 Spring Java 验证多部分文件大小限制

Java - 加载类路径之外的类。有什么选择

java - 使用 Java 的应用程序引擎 : Deferred tasks ignoring retry limit

java - 如何解决java.lang.ClassCastException : java. math.BigDecimal cannot be cast to [Ljava.lang.Object;在 java

java - 在 voltdb 的存储过程中运行选择查询后出现错误

java - 不幸的是,当我将 onClickListener 用作按钮时,应用程序已停止

java - 在 setter 中进行修剪是一种好习惯吗?

java - Android 异步点击时出错