Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VBA 6/VBA 7和Java 8之间匹配ZLib流?_Vba_Dll_Compression_Zlib_Jzlib - Fatal编程技术网

如何在VBA 6/VBA 7和Java 8之间匹配ZLib流?

如何在VBA 6/VBA 7和Java 8之间匹配ZLib流?,vba,dll,compression,zlib,jzlib,Vba,Dll,Compression,Zlib,Jzlib,我们能够做到以下几点 在VBA 6/VBA 7中: 请参阅32位zlibwapi.dll(VBA 6)或64位zlibwapi.dll(VBA 7) 调用compress()或compress2()方法以生成压缩的 溪流 调用uncompress()和uncompress2()方法进行解压缩 压缩流 在Java8中(Tomcat8上的JDK1.8) 有一个简单的java程序,使用新的 Deflater()实例 有一个简单的Java程序,可以使用Inflater()进行解压缩 实例 当VB

我们能够做到以下几点

在VBA 6/VBA 7中:

  • 请参阅32位zlibwapi.dll(VBA 6)或64位zlibwapi.dll(VBA 7)
  • 调用compress()或compress2()方法以生成压缩的
    溪流
  • 调用uncompress()和uncompress2()方法进行解压缩 压缩流
在Java8中(Tomcat8上的JDK1.8)

  • 有一个简单的java程序,使用新的 Deflater()实例
  • 有一个简单的Java程序,可以使用Inflater()进行解压缩 实例
当VBA发送压缩流供Javaservlet解压时,或者当Javaservlet发送压缩响应数据供VBA解压时,我们失败了

我们知道以下事实

  • ZLib提供了3种格式(raw、ZLib和gzip)
  • zlibwapi.dll中的方法是compress()和compress2() 生成zlib格式的压缩字节。有人提到过这一点 以同样的方式
  • Java端的Inflater()实例允许解压缩zlib格式 根据发布在的代码样本提供的数据
  • Java 8将zlib版本1.2.5集成为Java.utils.zip的一部分 包裹
  • 我们已确保使用的是zlibwapi.dll版本 1.2.5也在VBA侧
  • 我们已经尝试使用十六进制编辑器来比较由VBA和Java独立生成的压缩数据的字节流。我们注意到生成的压缩数据中存在一些差异。我们认为正是这种差异导致了两种环境之间的误解

    此外,我们认为,当通信发生时,必须有一些公共字符集来控制两个端点之间的编码/解码方案。我们甚至尝试比较VBA生成的字节流的十六进制代码,并将其传递给Javaservlet

  • 这些字节似乎插入了一些额外的0字节 通信时的实际压缩字节集之间 发生。这发生在VBA端。可能是因为一些unicode解释
  • 无论传递给Java的字节是什么,都会完全显示出来 他们的代表性不同
  • 我们需要修复独立工作的代码,以便彼此通信并和平地压缩和解压缩。我们认为有两件事需要解决——获取匹配的格式和使用按原样发送字节的字符集。我们正在寻求这方面专家的任何帮助,以帮助我们找到可能的解决办法的正确途径。我们需要答案

  • compress2()或compress()真的生成zlib格式吗
  • 哪个字符集允许我们按原样发送字节(如果有10个字节) 字节,我们要发送10个字节,而不是20个字节)。如果是unicode,则为0字节 在中间插入(因此10个字节变为20个字节)
  • 不要发送字符。发送字节

  • 谢谢-这有助于将VBA请求传递给Javaservlet。现在,另一种方法是引起问题(Java对VBA的响应)。我们注意到了你的回答。我们想编写我们自己的isValidZLibFormat(bytes[]),但需要更多地了解0aaa1000 bbbcccc字节结构,由您在那里解释。什么是a,b,c?请举例说明:如果((firstByte*256)+secondByte)%31==0)返回true,该操作是否有效;否则返回false;?每一个字母都有一点点。您可以用您喜欢的任何位替换a和b(有64种可能性),但是您需要设置c,以便由网络顺序中的两个字节组成的整数是31的倍数。您的if语句是您可以检查的内容的一部分。您还应该检查固定位,因此
    &&(firstByte&0x8f)==8
    。这并不能肯定地告诉您有一个zlib流,但它确实告诉您前两个字节是一个zlib头。请注意,随机数据在大约0.1%的时间内似乎具有有效的zlib头。在您的检查中&&(firstByte&0x8F)==8,您是否建议aaa位始终为0?您知道
    &
    的作用吗?