从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])
发布时间:2020-12-16 07:49:35 所属栏目:百科 来源:网络整理
导读:我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片 好消息是我在C中有代码,但任务是在C#中完成 C //Read the first values of the packet received DWORD image[200 * 64] = {0}; //used for algoritm(width always = 200 and height al
我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片
好消息是我在C中有代码,但任务是在C#中完成 C //Read the first values of the packet received DWORD image[200 * 64] = {0}; //used for algoritm(width always = 200 and height always == 64) int imgIndex = 0; //used for algoritm unsigned char rawbytes_[131072] = {0}; //read below unsigned char * rawbytes = rawbytes_; //destrination parameter for decompression(ptr) compressed = r.Read<WORD>(); //the length of the compressed bytes(picture) uncompressed = r.Read<WORD>(); //the length that should be after decompression width = r.Read<WORD>(); //the width of the picture height = r.Read<WORD>(); //the height of the picture LPBYTE ptr = r.GetCurrentStream(); //the bytes(file that must be decompressed) outLen = uncompressed; //copy the len into another variable //Decompress if(uncompress((Bytef*)rawbytes,&outLen,ptr,compressed) != Z_OK) { printf("Could not uncompress the image code.n"); Disconnect(); return; } //Algoritm to make up the picture // Loop through the data for(int c = 0; c < (int)height; ++c) { for(int r = 0; r < (int)width; ++r) { imgIndex = (height - 1 - c) * width + r; image[imgIndex] = 0xFF000000; if(-((1 << (0xFF & (r & 0x80000007))) & rawbytes[((c * width + r) >> 3)])) image[imgIndex] = 0xFFFFFFFF; } } 我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#) private void decompressFile(string inFile,string outFile) { System.IO.FileStream outFileStream = new System.IO.FileStream(outFile,System.IO.FileMode.Create); zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); System.IO.FileStream inFileStream = new System.IO.FileStream(inFile,System.IO.FileMode.Open); try { CopyStream(inFileStream,outZStream); } finally { outZStream.Close(); outFileStream.Close(); inFileStream.Close(); } } public static void CopyStream(System.IO.Stream input,System.IO.Stream output) { byte[] buffer = new byte[2000]; int len; while ((len = input.Read(buffer,2000)) > 0) { output.Write(buffer,len); } output.Flush(); } 我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法. 如何将byte []数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组? 另外,如何将zlib.NET代码更改为不保存文件? 解决方法
只需使用MemoryStreams而不是FileStreams:
// Assuming inputData is a byte[] MemoryStream input = new MemoryStream(inputData); MemoryStream output = new MemoryStream(); 然后你可以使用output.ToArray()来获取一个字节数组. 请注意,使用using语句而不是单个try / finally块通常会更好 – 否则如果第一次调用Close失败,则不会进行其余操作.你可以像这样嵌套它们: using (MemoryStream output = new MemoryStream()) using (Stream outZStream = new zlib.ZOutputStream(output)) using (Stream input = new MemoryStream(bytes)) { CopyStream(inFileStream,outZStream); return output.ToArray(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |