我在C#中编写了一个WebSocket,我正在尝试实现permessage-deflate扩展。似乎C#DeflateStream无法解压缩从Chrome(版本36.0.1985.143 m)发送的消息有效负载 - 这是我迄今为止尝试过的唯一消息。尝试解压缩时,我收到“块长度与其补码不匹配”消息。它不是RFC 1950,RFC 1951 2字节头问题。
我在C#中使用DeflateStream来压缩相同的数据(字符串'Hello'),试图查看压缩数据的差异。奇怪的是,除第一个字节外,压缩的Chrome有效负载和C#压缩数据完全相同!即使将样本压缩字符串从“hello”更改为其他任何内容,Chrome有效内容的第一个字节始终比第一个字节小1。我可以简单地在第一个字节加1,并且有效负载解压缩。
我找到了Compression Extensions for WebSocket草案,讨论了这个问题,但没有解决C#的问题。
第8.2.3.1节使用'Hello'示例字符串并显示正确的压缩有效负载: 0xf2 0x48 0xcd 0xc9 0xc9 0x07 0x00
第8.2.3.4节继续讨论使用BFINAL设置为1的Deflate块,它产生: 0xf3 0x48 0xcd 0xc9 0xc9 0x07 0x00 0x00
0xf3 数据是C#DeflateStream压缩和解压缩的问题。似乎算法中有一个涉及BFINAL的通货紧缩选项,C#不提供此设置?
我希望有人可能熟悉这个问题,或者知道如何解决这个问题。如果可能的话,我宁愿不在第三方库中链接。
感谢。
答案 0 :(得分:2)
它使用PPP协议,在发送之前从放气流的末尾丢弃0x00 0x00 0xff 0xff
。只需将这四个字节附加到解压缩器之前。
答案 1 :(得分:1)
我开发了Websocket component in C# that supports deflate compression。
首先,您无法压缩完整连接,因为DeflateStream
如何缓冲数据。您可以压缩邮件。换句话说,它不支持上下文接管,您必须在HTTP协商中指明。
此外,当你完成了DeflateStream
的刷新后,你必须向流写一个字节0
。请查看我的source code involved in writting compressed messages。
在Deflate WebSocketListener extension中,您可以找到以下示例: