使用 LZ4 时“尺寸与 prev_size 相比已损坏”

问题描述 投票:0回答:1

我使用 JSON 在服务器和客户端之间传递消息,两者都是用 C++ 编写的。为了提高性能,我正在评估压缩以及二进制格式(如 MessagePack)。我首先从压缩开始,因为它需要最少的代码更改。我应该注意到,在添加压缩之前,程序按预期工作(至少在我用于测试的输入上)。这是客户端和服务器用于通信的代码:

void serializeInt(std::array<uint8_t,8>& buf, int i, uint32_t val) { //Assumes that val is a 32-bit number (almost always true). Serializes in little endian in endian-agnostic way
    buf[i+0] = (val) & 0xFF;
    buf[i+1] = (val >> 8) & 0xFF;
    buf[i+2] = (val >> 16) & 0xFF;
    buf[i+3] = (val >> 24) & 0xFF;
}

uint32_t deserializeInt(std::array<uint8_t,8>& buf, int i){ //Deserialzes from little endian in endian-agnostic way
    return buf[i+0] | (buf[i+1] << 8) | (buf[i+2] << 16) | (buf[i+3] << 24);
}

boost::json::object readFromConn(){
    auto curr=currStruct();
    asio::error_code ec;
    
    asio::read(*(curr->conn), asio::buffer(curr->size_buf, 8), asio::transfer_exactly(8), ec);
    if (ec){
        throw RWError(ec);
    }
    
    auto compressed_size=deserializeInt(curr->size_buf, 0);
    auto input_size=deserializeInt(curr->size_buf, 4);
    

    auto compressed_data=(char*)malloc(compressed_size);
    auto input=(char*)malloc(input_size);
    
    asio::read(*(curr->conn), asio::buffer(compressed_data, compressed_size), asio::transfer_exactly(compressed_size), ec);
    
    if (ec){
        throw RWError(ec);
    }
    
    auto line=std::string_view(input,input_size);
    LZ4_decompress_safe(compressed_data, input, compressed_size, input_size);

    boost::json::object json=boost::json::parse(line,{}, {.max_depth=180,.allow_invalid_utf8=true,.allow_infinity_and_nan=true}).get_object();
    
    free(input);
    free(compressed_data);
    
    return json;
}

void writeToConn(boost::json::object& json){
    auto curr=currStruct();
    
    json["uuid"]=uuid;
    
    auto line=boost::json::serialize(json,boost::json::serialize_options{.allow_infinity_and_nan=true});

    auto input_size=line.size();
    auto input=line.c_str();
    auto max_compressed_size=LZ4_compressBound(input_size);
    auto compressed_data=(char*)malloc(max_compressed_size);
    
    auto compressed_size=LZ4_compress_default(input, compressed_data, input_size, max_compressed_size);
    
    serializeInt(curr->size_buf, 0, compressed_size);
    serializeInt(curr->size_buf, 4, input_size);
    asio::error_code ec;
    asio::write(*(curr->conn), asio::buffer(curr->size_buf,8), ec);
    
    if (ec){
        throw RWError(ec);
    }
    
    asio::write(*(curr->conn), asio::buffer(compressed_data,compressed_size), ec);
    
    if (ec){
        throw RWError(ec);
    }
    
    free(compressed_data);
}

但是,一旦添加压缩,我就会不断收到“corrupted size vs. prev_size”错误,但在服务器代码中却没有。

我从LZ4的

simple_buffer.c
文件中复制了压缩代码,所以假设它有效,我对这个问题感到困惑(也许我忽略了一些微妙的东西?)

c++ json glibc asio lz4
1个回答
0
投票

问题结果与我发布的代码片段无关,而是与其他一些文件有关:我更新了标头中结构的定义,但忘记重建使用该结构的文件,因此代码尝试访问不存在的字段。

© www.soinside.com 2019 - 2024. All rights reserved.