2

クライアントがサーバーに送信する2MBのデータを圧縮し、サーバーがデータを受信して​​圧縮を解除し、ファイルに書き込むクライアントサーバーアプリケーションで作業しています。

一部のパケットでは圧縮解除に失敗していたため、クライアント側とサーバー側の両方のコードに MD5 サムを追加し、データの圧縮後にクライアント側で圧縮解除を使用してデバッグしました。クライアント側で uncompress 関数に渡される同じパラメーターが、サーバー側で Z_DATA_ERROR で失敗しています。データの MD5sum は同じようです。私が次に何ができるかはまったくわかりません。

サーバー側のタラは次のようになります。

int ret = uncompress((Bytef*)unCompressedBuffer, &dwUncompressedBytes, (const Bytef*) receivedBuffer+525, dwBlockLength);

    if (ret == Z_OK)
    {

    }
    else
    {

        std::cout << " Uncompression failed for Block: " << iBlock << std::endl;

        std::cout << " PacketType: 4" << " Block Number:" << iBlock << " Length:" << dwBlockLength << "Error:" << ret << std::endl;

        PrintMD5SumResult((PBYTE)receivedBuffer+525, compressedSize-525);
        std::cout << " Uncompressed MD5 Checksum:0";
        PrintMD5SumResult((PBYTE)unCompressedBuffer, dwUncompressedBytes);

        }
}

クライアント コードは次のようになります。

int ret = compress2(l_pCompressData + 4, &destLen, 
        (const Bytef*) pBlockData, dwBlockSize, 6); 

memcpy(m_pWriteBuffer+525, l_pCompressData, destLen);
    m_dwWriteBytes = destLen+525;

std::cout << " \n Compressed MD5 Sum:0";
PrintMD5SumResult(m_pWriteBuffer, m_dwWriteBytes);
PrintMD5SumResult(m_pWriteBuffer+525, m_dwWriteBytes-525);

int ret = uncompress(m_pUnCompressData, &uncomLen, (const Bytef*)m_pWriteBuffer+525, destLen);

if(ret != Z_OK)
{
    std::cout << " Uncompression has failed." << std::endl;
}
else
{
    //std::cout << " UnCompressed MD5 Sum:0";
    //PrintMD5SumResult((PBYTE)m_pUnCompressData, md5Output, dwBlockSize);
}

// Write the 2MB to the network
WriteDataOverNetwork(m_NetworkStream, m_pWriteBuffer, m_dwWriteBytes, &dwNumBytes, TRUE);

問題を zlib の次のコードに絞り込みましたが、理解するのに苦労しました。inflate() 関数では、 (ZSWAP32(hold)) != state->check) このステートメントは失敗しています。誰かがここで私を助けてくれますか? ここで使用される MD5sum は Boton C++ ライブラリからのものです。

    case CHECK:
            if (state->wrap) {
                NEEDBITS(32);
                out -= left;
                strm->total_out += out;
                state->total += out;
                if (out)
                    strm->adler = state->check =
                        UPDATE(state->check, put - out, out);
                out = left;
                if ((
#ifdef GUNZIP
                     state->flags ? hold :
#endif
                     ZSWAP32(hold)) != state->check) {
                    strm->msg = (char *)"incorrect data check";
                    state->mode = BAD;
                    break;
                }
4

3 に答える 3

-1

これは私のテストです.arry[]は大きくなる可能性があり、同時にsour[]/dest[]/destLen/Lenが変更されます.ソースコードタイプを使用すると、問題は解決しました. 希望は役に立ちます。

次のように私のコード:

    #include <stdio.h>
    #include "zlib.h"

    int main(){
        //the buffer can be larger
    Bytef arry[] = "中文测试 yesaaaaa bbbbb ccccc ddddd 中文测试 yesaaaaa bbbbb ccccc ddddd 中文测试yesaaaaa bbbbb ccccc ddddd 中文测试 yes 我是一名军人!";
    //buffer length
        int size = sizeof(arry);
    //store the uncompressed data
        Bytef sour[2500];
        //store the compressed data
    Bytef dest[2500];
        //压缩后的数据可能比源数据要大
    unsigned long destLen = 2500;
        //解压数据时因为不知道源数据大小,设置时长度尽可能大一些。以免出错
    unsigned long Len = 2500;
    int ret = -1;
    ret = compress(dest,&destLen,arry,size);
    //dest[destLen] = '\0';
    printf("ret = %d\ndest = %s\n", ret, dest);
    ret = uncompress(sour,&Len,dest,destLen);
    //sour[size-1] = '\0';
    printf("ret = %d\nsour = %s\n", ret, sour);
    return 0;
}
于 2013-09-30T02:05:37.043 に答える