我正在使用 Qt 开发 NMDC 客户端(p2p、DC++ 和朋友)。协议本身非常简单:
$command parameters|
除了压缩:
“ZPipe 通过向客户端发送命令 $ZOn| 来工作。在 $ZOn 之后,将跟随一个包含命令的 ZLib 压缩流。该流将以 ZLib 定义的 EOF 结束。(压缩流中没有 $ZOff!)”
以下是相关代码:
QTcpSocket *conn;
bool compressed;
QByteArray zbuffer;
QByteArray buffer;
// ...
void NMDCConnection::on_conn_readyRead() {
// this gets called whenever we get new data from the hub
if(compressed) { // gets set when we receive $ZOn
zbuffer.append(conn->readAll());
// Magic happens here
if( stream_is_complete ) {
buffer.append(uncompressed_stream);
buffer.append(remainder_of_data);
compressed = false;
}
} else {
buffer.append(conn->readAll());
};
parse(buffer);
}
那么,如何获得stream_is_complete
、uncompressed_stream
和的值remainder_of_data
?我无法寻找下一个'$',因为流可以包含它。我尝试在 zlib 文档中寻找类似于 EOF 的东西,但没有这样的东西,事实上,每个流都以看似随机的字符结尾。
我也玩过 qUncompress(),但它需要一个完整的流,仅此而已。