首页 > 编程语言 >java.util.zip.DataFormatException: incorrect header check

java.util.zip.DataFormatException: incorrect header check

时间:2024-01-18 11:57:30浏览次数:22  
标签:incorrect java zip compress return ByteArrayOutputStream new byte

C#保存的数据都是使用以下的压缩算法保存

        public static byte[] Zip2(byte[] content)
        {
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
            using (DeflateStream stream = new DeflateStream(ms, CompressionMode.Compress, true))
            {
                stream.Write(content, 0, content.Length);
                stream.Close();
                return ms.ToArray();
            }
        }

问ChatGpt要了一段java解压的代码,结果提示:java.util.zip.DataFormatException: incorrect header check

怀疑base64解的byte[]有问题,因为两个IDE里,一个显示正数,一个显示负数。结果存文件比较是一致的。

ChatGpt一会说兼容一会说可能不兼容,建议我使用GZip。

查微软文档,说是行业标准

https://learn.microsoft.com/zh-cn/dotnet/api/system.io.compression.deflatestream?view=net-6.0

注解

此类表示 Deflate 算法,它是用于无损失文件压缩和解压缩的行业标准算法。 从 .NET Framework 4.5 开始,DeflateStream该类使用 zlib 库。 因此,它提供更好的压缩算法,在大多数情况下,压缩文件比早期版本的.NET Framework要小。

最后,从这文章得到一些灵感

https://www.cnblogs.com/yihuihui/p/9671131.html

原来java的Deflater的构造方法,有一个boolean值(nowrap)。尝试后发现,C#传过来的byte[],设置true就可正常解压了。以下是两段JAVA的方法都可正常解压的方法

public static byte[] decompress(byte[] compressedData) {
        Inflater inflater = new Inflater(true);
        inflater.setInput(compressedData);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressedData.length);
        byte[] buffer = new byte[1024];
        try {
            while (!inflater.finished()) {
                int count = inflater.inflate(buffer);
                outputStream.write(buffer, 0, count);
            }
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return outputStream.toByteArray();
    }
private static byte[] decompress2(byte[] bts) {       
        ByteArrayInputStream bin = new ByteArrayInputStream(bts);
        InflaterInputStream infIn = new InflaterInputStream(bin,new Inflater(true));
        ByteArrayOutputStream btOut = new ByteArrayOutputStream(128);
        try {
            int b = -1;
            while ((b = infIn.read()) != -1) {
                btOut.write(b);
            }
            bin.close();
            infIn.close();
            btOut.close();
            return btOut.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

也提供一段C#能解压缩的JAVA的压缩方法

    public static byte[] compress(byte[] data) {
        byte[] output=null;
        Deflater compress = new Deflater(Deflater.DEFAULT_COMPRESSION, true);
        //compress.reset();
        compress.setInput(data);
        compress.finish();
        ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);
        try{
            byte[] buf = new byte[1024];
            while (!compress.finished()) {
                int cnt = compress.deflate(buf);
                bos.write(buf, 0, cnt);
            }
            output = bos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return output;
    }

我很少写java的代码,以下方法仅供参考。应用时需自行考虑可能发生的问题。

这还有一篇文章,原来node.js的行为与C#是一样的

https://blog.csdn.net/Liuying_AD/article/details/122186851

本文只发表在博客园,请勿转载!

 

标签:incorrect,java,zip,compress,return,ByteArrayOutputStream,new,byte
From: https://www.cnblogs.com/kevin-Y/p/17972199

相关文章

  • Javascript中addEventListener的3个参数
    //例document.addEventListener('click',()=>{//dosomething...},false) 1.addEventListener,接收3个参数第一个参数event:监听的事件名称第二个参数是函数:需要执行的事件第三个参数是useCapture(变量):用来判断是捕获还是冒泡 2.第三个参数为userCapyu......
  • 应届生必读:Java真实项目的开发流程和常用工具
    本文出自本人写的书,谢绝转载,更勿抄袭。本人有多年的Java面试官经验,经常要和一些包装项目经验的求职者打交道。当然平时也兼职做些Java面试辅导工作,最近也陆续帮一些在校生朋友成功找到Java工作。在辅导在校生朋友找工作的过程中,本人发现,其实真有不少朋友,是跟着视频跑通了一个或......
  • 从JDK8升级到JDK17:探索JAVA的新特性和改进
    升级到JDK17的必要性JDK8提供了很多实用且常用的特性,例如lambda表达式等,再加上超长的支持时间(JDK8支持到2030年,比JDK11的2026年和JDK17的2029年都要长)。而从JDK9往后,JDK的发布周期也缩短为6个月,也间接导致每个版本的新特性相对较少,大家的对新特性的提升感知不强,所以升级欲望不是......
  • JAVA自定义注解
     importjava.lang.annotation.*;//定义一个自定义注解public@interfaceMyAnnotation{//在注解中定义属性Stringvalue()default"";}//使用自定义注解classMyClass{//在类上应用自定义注解@MyAnnotation(value="Hello")pu......
  • 【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)
    承接上文在阅读了上篇文章《【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)》之后,相信您对HashMap的基本原理和基础结构已经有了初步的认识。接下来,我们将进一步深入探索HashMap的源码,揭示其深层次的技术细节。通过这次解析,您将更深入地理解HashMap的......
  • JavaScript自建文档
    JavaScript温习文档JavaScript的使用场景网页特效发(node.js)桌面程序(electron)app(cordova)硬件控制(物联网)游戏开发(cocos2d-js)浏览器执行js过程渲染引擎:解析html和css,chrome用的blink,老版本用的webkitjs引擎:也叫js解析器,用来读取网页中的JavaScript......
  • JavaScript(JS) 判断没有属性的空对象{}的四种方法
    ​ JavaScript(JS)中对象没有属性初始化时,可能使用{}进行初始化,如此我们判断这样的没有属性的空对象就不是很方便,本文主要介绍JavaScript(JS)中判断没有属性的空对象{}的五种方法,以及相关的示例代码。1、通过JSON.stringify()判断可以使用JSON.stringify()将Javascript对象......
  • Java里public类的定义为什么报错
    这是一个普通的main定义,这里我们看到public修饰了classMain,并且我们的Java文件名也是Main,这是合理的定义,没有报错。因为public修饰的类只能在自己的文件里,Main类是public的,所以它在Main的Java文件里可以使用。像这样,它就会出错。因为是public修饰的类,但是Java文件名并不是Ca......
  • java生成可执行文件
    创建可执行的JAR文件包--制作一个可执行的JAR文件包来发布你的程序是JAR文件包最典型的用法 Java程序是由若干个.class文件组成的。这些.class文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给CLASSPATH环境变量或者jav......
  • Java学习日记 Day3 我怀疑世界就是一个巨大的草台班子
    JavaSE:①包装类:对比基础数据类型有更高级的功能。另外在容器中(或者叫集合)包装类有重要的作用。容器中只能存放包装类,不能存放基础数据类型。包装类一些特性:被final修饰,不能有子类了。。。jdk1.0就有,是开服玩家。。。其实在代码底层中包装类封装了一个int。。。自动装箱自动拆箱......