我用C#编写了一个WebSocket,并试图实现permesage deflate扩展。C#DeflateStream似乎无法解压缩从Chrome(36.0.1985.143m版本)发送的消息有效载荷,这是我迄今为止唯一尝试过的一个。我得到了";块长度与其补码"不匹配";尝试解压缩时的消息。这不是RFC 1950,RFC 1951的2字节头问题。
我在C#中使用了DeflateStream来压缩相同的数据(字符串"Hello"),试图查看压缩数据中的差异。奇怪的是,压缩的Chrome负载和C#压缩的数据除了第一个字节外完全相同!Chrome负载的第一个字节总是比第一个字节少1,即使在将示例压缩字符串从"hello"更改为其他任何字符串时也是如此。我可以简单地在第一个字节上加1,有效负载就会解压缩。
我发现了一个针对WebSocket的压缩扩展草案,它讨论了这个问题,但并没有解决C#的问题。
第8.2.3.1节使用"Hello"示例字符串,并显示正确的压缩有效载荷:0xf2 0x48 0xcd 0xc9 0xc9 0x07 0x00
然后,第8.2.3.4节继续讨论使用BFINAL设置为1的放气块,从而产生:0xf3 0x48 0xcd 0xc9 0xc9 0x07 0x00 0x00
0xf3数据是C#DeflateStream压缩和解压缩的数据,没有任何问题。似乎在涉及BFINAL的算法中有一个通货紧缩选项,而C#不提供此设置?
我希望有人可能熟悉这个问题,或者知道如何解决这个问题。如果可能的话,我宁愿不在第三方库中链接。
谢谢。
它使用PPP协议,该协议在传输之前将0x00 0x00 0xff 0xff
从deflate流的末尾丢弃。只需在将这四个字节馈送到解压缩器之前将其附加即可。
我在C#中开发了一个支持deflate压缩的Websocket组件。
首先,不能压缩完整的连接,因为DeflateStream
是如何缓冲数据的。您可以压缩邮件。换句话说,它不支持上下文接管,您必须在HTTP协商中指出这一点。
此外,当刷新完DeflateStream
后,必须向流中写入一个字节0
。请检查我编写压缩消息的源代码。
在Deflate WebSocketListener扩展中,您可以找到以下示例:
- 谈判
- 必须在消息中启用的标志
- 写作
- 阅读