0

我正在用 C++ 为 Steam 协议编写一个插件。我正在使用https://github.com/seishun/SteamPP ,它使用来自https://github.com/SteamRE/SteamKit的 protobufs ,通常它可以工作。我可以与 Steam 通信,我可以毫无问题地发送和接收单条消息(包括登录),但 Steam 经常发送几条压缩在一条消息中的消息(来自 protobuf 的 EMsg::Multi),这就是我的问题。我无法正确解压缩它们。我不明白我做错了什么。

std::string unzip(std::string &input) {
auto archive = archive_read_new();

auto result = archive_read_support_filter_all(archive);
assert(result == ARCHIVE_OK);

result = archive_read_support_format_zip(archive);
assert(result == ARCHIVE_OK);

result = archive_read_open_memory(archive, &input[0], input.size());
assert(result == ARCHIVE_OK);

archive_entry* entry;
result = archive_read_next_header(archive, &entry);
if (result != ARCHIVE_OK) {
    return "read next header error " + std::to_string(result);
}
assert(result == ARCHIVE_OK);

std::string output;
output.resize(archive_entry_size(entry));

auto length = archive_read_data(archive, &output[0], output.size());
assert(length == output.size());
if (length != output.size()) {
    return "hello world" + std::to_string(length);
}

assert(archive_read_next_header(archive, &entry) == ARCHIVE_EOF);

result = archive_read_free(archive);
assert(result == ARCHIVE_OK);

return output;
}

在此函数(libarchive)中,archive_read_data 返回 -25,这是一个错误代码,下一个断言会引发错误。怎么了?它在 C# SteamKit 版本和 node.js 版本中运行良好。我也尝试过 Crypto++ Gunzip,但它会引发 CryptoPP::Gunzip::HeaderErr 异常。 检查调试 GIF

4

1 回答 1

0

我认为您的 Libarchive 中缺少 Zlib,因为 Steam 消息被压缩了,您需要 Zlib 来处理它们。现在 libarchive 无法处理它们,因此由于文件类型不受支持而返回 -25。尝试使用 CMake 中附加的 Zlib 重新编译 libarchive。

于 2018-04-03T19:06:28.353 回答