C# 多线程,DeflateStream进行解压时,报 "块的长度与它的补集不匹配"

东江一笑 2017-10-18 10:41:11

//l输入为inMS : MemoryStream
inMS.Seek(0, SeekOrigin.Begin);
DeflateStream ds = DeflateStream(inMS, CompressionMode.Decompress);
var outMS = new MemoryStream();//输出ms
ds.CopyTo(outMS); //此处会报"块的长度与它的补集不匹配"
ds.Close();
ds.Dispose();


报错的情况:貌似正常情况不会报错。主要实现压测工具,工具中打算启动1000个客户端Socket,使用异步收发,当启动到200个左右时,收消息出现这个问题。另,每个Socket的异步处理是独立的输入,不需要做线程安全处理(?)
报错的原因:inMS的Position不为0,但是在第一行已经把其设置为0了。明明 已经设置过了,在调试时,还是有点问题。

求大神指点
...全文
712 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
闪星2 2018-06-14
  • 打赏
  • 举报
回复
.net的封装有点不同,解压的话得先去掉deflate压缩算法的前面两个标志位,第一个字节是 78h(120b),第二个字节是 DAh(218b),然后再解压。 实例代码:

    Public Function DeCompress(pBytes As Byte()) As Byte()
        ' Deflate 算法压缩之后的数据,第一个字节是 78h(120b),第二个字节是 DAh(218b)
        If pBytes.Length < 2 OrElse
            (Not pBytes(0) = 120 AndAlso Not pBytes(1) = 218) Then
            Return pBytes
        End If

        Dim deCompressBytes() As Byte = New Byte() {}

        Try
            Dim cs As New MemoryStream(pBytes)
            ' 先读取前两个deflate压缩算法标识字节,然后才能用deflateStream解压
            ' 这个行为与 zlib库、sharpZiplib库等不同(这些库都是直接传入解压)
            cs.ReadByte()
            cs.ReadByte()
            Dim dms As New MemoryStream()
            Using ds As New DeflateStream(cs, CompressionMode.Decompress, False)
                ds.CopyTo(dms, 8192)
            End Using

            deCompressBytes = dms.ToArray()
        Catch ex As Exception
            throw ex
        End Try

        Return deCompressBytes
    End Function
njit_77 2017-10-18
  • 打赏
  • 举报
回复
inMS是线程安全的吗? 另你的代码DeflateStream ds = DeflateStream(inMS, CompressionMode.Decompress); 没有提示错误?

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧