C++从文件中读取并比较魔数(Magic Number)

标签 c++ file io binary magic-numbers

我有我想用 C++ 阅读的文件。我必须阅读和检查的第一件事是文件的魔数(Magic Number)。在我的例子中,它是十六进制值:0xABCDEF00

我这样阅读和比较数字:

ifstream input ("C:/Desktop/myfile", ios::binary);
if (input.is_open()) {
input.seekg(0, ios::beg);
unsigned char magic[4] = {0};
input.read((char*)magic, sizeof(magic));

if(magic[0] == 0xAB &&
   magic[1] == 0xCD &&
   magic[2] == 0xEF &&
   magic[3] == 0x00) {
   cout << "It's my File!" << endl;
} else {
   cout << "Unknown File!" << endl;
}
}

这很好用,但是有没有办法一次比较整个读取的 char[]-Array?像这样:

unsigned int magicNumber = 0xABCDEF00;
... same code for reading file as above ...
Instead of checking each Array-Entry a way like this: 

if(magic == magicNumber) {
    do something ...
}

很高兴知道是否有这样的方法 - 如果没有,谢谢你告诉我没有这样的方法:)

最佳答案

你可以这样做:

union magic_t {
    uint8_t bytes[4];
    uint32_t number;
};

然后如你所愿:

magic_t my_magic = {0xAB, 0xCD, 0xEF, 0};
magic_t file_magic;
input.read((char *) file_magic.bytes, sizeof(file_magic));
if ( file_magic.number == my_magic.number )...

而且您根本不需要关心字节顺序。

根据字节顺序,数字可能会有所不同,但这根本不重要,因为即使数字不是 0xABCDEF00,它也始终是正确的字节序列。

或者,可选地,我们可以只使用转换(但我认为那很丑陋)。

关于C++从文件中读取并比较魔数(Magic Number),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822645/

相关文章:

C# WebClient DownloadProgressChanged 无法正常工作

linux - 如何不处理之前已经处理过的文件? (它们不会被压缩或重命名)

c - 如何将输入发送到 C 中的进程?

gdb - 如何使用 gdb 进行输入重定向?

c++ - Qt 子类 QStyledItemDelegate 不提供对列的编辑

java - 如何使用 java FIle i/o 替换、删除或更新文件中的行

c++ - 以纳秒为单位存储时间戳 C++

c++ - 在 C++ 中读取每行 2 个数字

java - 在整数数组中查找第一个非重复数字

c++ - TinyXML2 - 入门麻烦