求教啊,一个关于GZipStream类解压的问题

问题描述

我在使用GZipStream类进行压缩后使用socket传输,再客户端收到后,再使用GZipStream解压,然后奇怪的问题出现了,在我自己写的客户端解压都没问题,当其他人写的一个Unity的程序调用的时候就报错了,错误如下,好郁闷啊,整个方法我都封装了CreateZStream----System.EntryPointNotFoundException:CreateZStreamat(wrappermanaged-to-native)System.IO.Compression.DeflateStream:CreateZStream(System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr)atSystem.IO.Compression.DeflateStream..ctor(System.IO.StreamcompressedStream,CompressionModemode,BooleanleaveOpen,Booleangzip)[0x00000]in<filenameunknown>:0atSystem.IO.Compression.GZipStream..ctor(System.IO.StreamcompressedStream,CompressionModemode,BooleanleaveOpen)[0x00000]in<filenameunknown>:0atConnectDataServer.ConnectServerClass.GetDecompressData(System.Byte[]bytRecv)[0x00000]in<filenameunknown>:0

解决方案

解决方案二:
源码如下///<summary>///接收服务消息///</summary>///<paramname="obj"></param>privatevoidReceiveServerMessage(objectobj){byte[]bytRecv=newbyte[10240000];try{intintRecv=socket.ReceiveFrom(bytRecv,refendSend);if(intRecv>0){byte[]bytData=GetDecompressData(bytRecv);strResult=Encoding.UTF8.GetString(bytData);intintBegin=strResult.IndexOf("<mcuData>");if(intBegin<0){strResult=string.Empty;}else{#region客户端测试XmlDocumentdoc=newXmlDocument();doc.LoadXml(strResult);doc.Save(@"E:AAAXin.xml");intIndex++;#endregion}}}catch{}}privatebyte[]GetDecompressData(byte[]bytRecv){byte[]result=newbyte[10240000];try{//byte[]bytResult=null;MemoryStreamcompressedStream=newMemoryStream(bytRecv);using(MemoryStreamoutStream=newMemoryStream()){using(GZipStreamdecompress=newGZipStream(compressedStream,CompressionMode.Decompress,true)){//decompress.CopyTo(outStream);//result=outStream.ToArray();decompress.Read(result,0,result.Length);}}}catch(Exceptionex){WriteWindowServeLog(ex.Message+"----"+ex.ToString());}returnresult;}

解决方案三:
这个错误的意思就是调用c++代码的时候找不到相应的函数
解决方案四:
引用2楼shingoscar的回复:

这个错误的意思就是调用c++代码的时候找不到相应的函数

然后呢,为什么调用相同环境,调用相同的DLL,我的程序可以,别人的不行?
解决方案五:
引用3楼YiQiJinBu的回复:

Quote: 引用2楼shingoscar的回复:
这个错误的意思就是调用c++代码的时候找不到相应的函数

然后呢,为什么调用相同环境,调用相同的DLL,我的程序可以,别人的不行?

你真的确定是相同的环境?
解决方案六:
引用4楼shingoscar的回复:

Quote: 引用3楼YiQiJinBu的回复:
Quote: 引用2楼shingoscar的回复:
这个错误的意思就是调用c++代码的时候找不到相应的函数

然后呢,为什么调用相同环境,调用相同的DLL,我的程序可以,别人的不行?

你真的确定是相同的环境?

同一台电脑,同一个DLL,区别就在于我自己写的测试客户端是一个winForm程序,别人的是一个Unity程序的客户端调用我的Dll附上完整类代码usingSystem;usingSystem.IO;usingSystem.IO.Compression;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading;usingSystem.Xml;namespaceConnectDataServer{publicclassConnectServerClass{privateSocketsocket;privateIPEndPointipe;privateEndPointendSend;privatebyte[]bytSendOrder=newbyte[20];privatestringstrResult=string.Empty;privateintintIndex=0;publicvoidConnectServer(){intport=2000;stringstrHost=GetAddressIP();//"127.0.0.1";//建立IP对象IPAddressip=IPAddress.Parse(strHost);//建立端口对象ipe=newIPEndPoint(ip,port);//创建socket对象socket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);endSend=newIPEndPoint(IPAddress.Any,0);//socket.Bind(ipe);}///<summary>///获取本地IP地址信息///</summary>privatestringGetAddressIP(){///获取本地的IP地址stringAddressIP=string.Empty;foreach(IPAddress_IPAddressinDns.GetHostEntry(Dns.GetHostName()).AddressList){if(_IPAddress.AddressFamily.ToString()=="InterNetwork"){AddressIP=_IPAddress.ToString();}}returnAddressIP;}///<summary>///发送信息///</summary>///<paramname="strSendOrder"></param>publicvoidSendMessage(stringstrSendOrder){bytSendOrder=Encoding.ASCII.GetBytes(strSendOrder);socket.SendTo(bytSendOrder,bytSendOrder.Length,SocketFlags.None,ipe);}///<summary>///接搜消息///</summary>///<returns></returns>publicstringReceiveMessage(){//接收服务器端的返回信息Threadthead=newThread(ReceiveServerMessage);thead.IsBackground=true;thead.Start();returnstrResult;}///<summary>///接收服务消息///</summary>///<paramname="obj"></param>privatevoidReceiveServerMessage(objectobj){byte[]bytRecv=newbyte[10240000];try{intintRecv=socket.ReceiveFrom(bytRecv,refendSend);if(intRecv>0){byte[]bytData=GetDecompressData(bytRecv);strResult=Encoding.UTF8.GetString(bytData);intintBegin=strResult.IndexOf("<mcuData>");if(intBegin<0){strResult=string.Empty;}else{#region客户端测试XmlDocumentdoc=newXmlDocument();doc.LoadXml(strResult);doc.Save(@"E:AAAXin.xml");intIndex++;#endregion}}}catch{}}privatebyte[]GetDecompressData(byte[]bytRecv){byte[]result=newbyte[10240000];try{//byte[]bytResult=null;MemoryStreamcompressedStream=newMemoryStream(bytRecv);using(MemoryStreamoutStream=newMemoryStream()){using(GZipStreamdecompress=newGZipStream(compressedStream,CompressionMode.Decompress,true)){//decompress.CopyTo(outStream);//result=outStream.ToArray();decompress.Read(result,0,result.Length);}}}catch(Exceptionex){WriteWindowServeLog(ex.Message+"----"+ex.ToString());}returnresult;}publicvoidWriteWindowServeLog(stringstrLog){using(FileStreamfs=newFileStream(@"D:LogClass.txt",FileMode.Append)){using(StreamWritersw=newStreamWriter(fs)){sw.WriteLine(strLog);sw.Close();}fs.Close();}}///<summary>///关闭连接///</summary>publicvoidCloseConnectDataServer(){socket.Shutdown(SocketShutdown.Both);socket.Close();}}}

解决方案七:
这就是环境上的区别啊winform是windows自带的运行环境unity是mono的环境
解决方案八:
你考虑下别用.net自带的GZipStream换个第三方的
解决方案九:
引用7楼shingoscar的回复:

你考虑下别用.net自带的GZipStream换个第三方的

试过了,还是不行,但是同样的方法,我把它放到控制台单独跑就没问题,不懂为什么,so,我最后的处理方式是,让Unity调用的那个DLL里生成zip压缩包,然后调另外的exe单独经行解压步骤,功能实现了,但是不知道会不会有什么问题,求指点。。。

时间: 2024-09-20 09:35:16

求教啊,一个关于GZipStream类解压的问题的相关文章

vc zip,unzip类 解压.docx文件内容是乱码,求大神解答啊

问题描述 vc zip,unzip类 解压.docx文件内容是乱码,求大神解答啊 目前只有.docx文件解压有问题,为什么会这样,求大神帮忙解答下,我没有c币,谢谢好心人了!!!! 解决方案 可以换成ZLib开源代码来试试,很不错,也很简单 解决方案二: 可以换成ZLib开源代码来试试,很不错,也很简单 解决方案三: 我发现.odcx文件用office可以打开,我用的wps,呵呵,找了一天原因,真坑爹 还是谢谢你的回答

zlib http-使用zlib库解压http数据时遇到的问题

问题描述 使用zlib库解压http数据时遇到的问题 最近在用c++写一个爬虫程序,遇到一个问题,不能解压服务器返回的压缩数据,解压数据的函数是在网上看的,如下: bool GzipDecompress(Byte *source, uLong source_length, Byte *dest, uLong *dest_length) { int err = 0; z_stream d_stream = {0}; static char dummy_head[2] = { 0x8 + 0x7 *

赶走周一综合症,办公室最in解压绝招

又到了周一,在Monday Day的日子里,大家要把双休日积累的邮件看完,要准备这周的工作计划,还要开各种周会.例会.白领一族只能叹息忙day真是伤不起...各种逃避情绪.烦躁心情都一涌而上!你有想到什么排除不良情绪.解压的好方法吗?吃饭.shopping.看电影.打游戏?你还想得到更多吗?你知道还有什么比这些方式更有效的解压绝招吗? &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 小编传授你一个绝好的解压大法,

怎么用c#写一个解压指定目录下所有的压缩文件,并且把压缩文件里面的内容放进指定文件夹呢?

问题描述 怎么用c#写一个解压指定目录下所有的压缩文件,并且把压缩文件里面的内容放进指定文件夹呢? 怎么用c#写一个解压指定目录下所有的压缩文件,并且把压缩文件里面的内容放进指定文件夹呢? 解决方案 http://www.cnblogs.com/zfanlong1314/p/4202695.html 解决方案二: csharp文件操作类 遍历 递归 着重这三点 解决方案三: 放进文件夹就是先创建一个和压缩文件同名的目录,然后作为解压目录. 解决方案四: 这个问题,可以分成几部分:1 遍历指定目录

打包-怎样写一个压缩解压Shell脚本

问题描述 怎样写一个压缩解压Shell脚本 文件的名字不能写死, 可以传入一个参数,打包指定的文件 求教各位大神怎么写 解决方案 #!/bin/sh tar zcvf $1.tar.gz $1 解决方案二: tar zcf foo.tgz foo 解决方案三: 主要看你想压缩成什么格式的. tar.gz, tar, tar.Z, zip, tar.z, etc. 传入两个参数,一个参数是压缩类型,一个是压缩的文件 下面是脚本里的一个压缩的写法. #!/bin/sh tar -zcvf $2.$1

使用java基础类实现zip压缩和zip解压工具类分享_java

使用java基础类写的一个简单的zip压缩解压工具类 复制代码 代码如下: package sun.net.helper; import java.io.*;import java.util.logging.Logger;import java.util.zip.*; public class ZipUtil {    private final static Logger logger = Logger.getLogger(ZipUtil.class.getName());    privat

用ant包实现zip文件解压的类

      前一阵做东西的时候需要一个解zip的实现,开始只知道ant包的zip子包实现了对中文路径名的支持,感觉其他应该和util包中的zip子包没什么区别,但真写起来还是有点别扭的,毕竟它没有提供ZipInputStream类,因此只好用getEtries获得枚举类型的实体集,它的缺点就在于其破坏了实体间的级联关系,因此处理起来没有util.zip包方便了.    代码有点东拼西凑的成分,就算是转贴吧,呵呵!!! import java.io.*;import java.util.*;imp

C#制作CAB压缩包压缩解压类

代码如下: 以下为引用的内容: using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Diagnostics; namespace Com.ImYan.CabHelper { /// <summary> /// CAB文件压缩解压类 /// </summary> public class Cab { #region 属性列表 Propertie

微软-用c# 写的一个解压文件的程序 解压之后里面的文件不见了 贴上代码~

问题描述 用c# 写的一个解压文件的程序 解压之后里面的文件不见了 贴上代码~ string the_rar; RegistryKey the_Reg; object the_Obj; string the_Info; try { the_Reg = Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionApp PathsWinRAR.exe"); the_Obj = the_Reg.GetVa