gpt4 book ai didi

c++ - 从 C++ 中的二进制文件读取和比较字节数据的最佳方法?

转载 作者:行者123 更新时间:2023-11-30 01:45:39 25 4
gpt4 key购买 nike

我不知道如何使用 char 数组(std::ifstream.read() 的第一个参数来比较不同类型的数据)。

例如,如果我试图阅读 Windows PE 文件的魔力,我正在这样做,但我觉得有更好的方法来解决它,因为据我所知,这需要我在文件为 std::array:

std::array<char, 2> magic;
in.read(magic.data(), magic.size());
std::array<char, 2> shouldBe = { 0x4d, 0x5a }; // MZ for dos header

if(magic == shouldBe) {
// magic correct
}

这会给我编译器警告,例如从 int 到 char 的无效转换。我也不太明白我是如何阅读十六进制值与 ASCII 字符完全不相关的其他文件的魔法。例如,每个以 0xCAFEBABE 开头的 Java 类文件都是一个神奇的东西,但当我将它读入 4 个字符,然后将每个部分转换为一个 int 时,我在左边得到了我不想要的填充。

char* magic = new char[4];
in.read(magic, 4);
// how can I compare this array to 0xCAFEBABE?

当我遍历每个部分然后转换为 int 并在输出流中使用 std::hex 时的输出:

ffffffca fffffffe ffffffba ffffffbe

解析二进制文件格式(如 PE 文件和 Java 类)中使用的大量不同类型的值的最佳方法是什么?

最佳答案

这个方法非常好。唯一的问题是这一行:

std::array<char, 2> shouldBe = { 0x4d, 0x5a }; // MZ for dos header

列表初始化不允许缩小转换,因此您只需要进行一些显式转换:

std::array<char, 2> shouldBe = { (char)0x4d, (char)0x5a };

关于c++ - 从 C++ 中的二进制文件读取和比较字节数据的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34297271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com