我在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#不提供此设置?
我希望有人可能熟悉这个问题,或者知道如何解决这个问题.如果可能的话,我宁愿不在第三方库中链接.
谢谢.
解决方法:
它使用PPP协议,在传输之前从deflate流的末尾丢弃0x00 0x00 0xff 0xff.只需将这四个字节附加到解压缩器之前.