1

TCPソケットを使用して接続するサーバーとクライアントがあります。クライアント (C++ で記述) で、 zlibライブラリを使用して文字列 (str) を圧縮します。

uLongf compressedStringLength = compressBound(str.length());
Bytef* compressedString = new Bytef[compressedStringLength];
const Bytef* originalString = reinterpret_cast<const Bytef*>(str.c_str());
compress(compressedString, &compressedStringLength, originalString, str.length());

次に、サーバーに送信します。これは、圧縮された文字列をソケットに書き込むコード行です。

int bytesWritten = write(sockfd, &compressedString, compressedStringLength);

サーバー (C# で記述) で、圧縮されたバイトのストリームをソケットから受信し、DeflateStream クラスを使用して解凍します。

NetworkStream stream = getStream(ref server); //server is a TcpListener object which is initialized to null.
byte[] bytes = new byte[size];
stream.Read(bytes, 0, size);
Stream decompressedStream = Decompress(bytes);

これが解凍機能です。

private static Stream Decompress(byte[] input)
{
        var output = new MemoryStream();

        using (var compressStream = new MemoryStream(input))
        using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress))
        {
            decompressor.CopyTo(output);
        }

        output.Position = 0;
        return output;
 }

圧縮プロセスとソケットを介した圧縮バイトの送信は機能しますが、上記の Decompress 関数の行で例外が発生しdecompressor.CopyTo(output);ます: System.IO.InvalidDataException: ブロックの長さが補数と一致しません。

誰かが問題が何であるかを知っていますか?どうすれば解決できますか?

編集:解凍プロセスの開始前に、最初の2バイトをスキップしようとしました。

4

0 に答える 0