我有我想在C 中读取的文件。我必须阅读和检查的第一件事是文件的魔术数。就我而言,这是十六进制值: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 [] - 数组?喜欢这样:
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 ...
}
很高兴知道是否有这样的方法 - 如果不感谢我没有这样的方式:)
好的旧 memcmp
在这里可以提供帮助。阅读unsigned char magic[4]
后,您可以简单地进行比较:
const unsigned char magicref[4] = {0xAB, 0xCD, 0xEF, 0}
if (memcmp(magic, magicref, sizeof(magic)) == 0) {
// do something ...
}
这是独立的。
如果您知道平台会给您提供魔术数字,并且不关心其他平台上的可移植性,则可以直接处理所有内容,例如uint32_t
:
uint32_t magic, refmagic = 0xABCDEF00; // big endian here...
input.read(reinterpret_cast<char *>(&magic), sizeof(magic)); // directly load bytes into uint32_t
if (magic == refmagic) {
//do something...
}
这不是在不同平台上的便携式,但可以在简单的情况下使用大胆的红色闪烁字体,说当心:仅在Big Endian System
您可以做:
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 )...
,您根本不需要关心endianess。
取决于末端的数字可能会有所不同,但这根本不重要,因为即使数字不是0xabcdef00,这始终是正确的字节顺序。
或选择,我们只能使用铸造(但我认为这很丑)。
如果您知道平台的端度,则可以使用uint32_t
变量来执行此操作。
对于一个小的endian系统,请使用:
uint32_t number;
input.read(reinpterpret_cast<char*>(&number), 4);
if ( number == 0x00EFCDAB )
{
cout << "It's my File!" << endl;
}
对于大型末日系统,请使用:
uint32_t number;
input.read(reinpterpret_cast<char*>(&number), 4);
if ( number == 0xABCDEF00 )
{
cout << "It's my File!" << endl;
}
这里已经有很好的答案!对于记录,这里是使用标准<algorithm>
库的equal()
的变体:
unsigned char magic[4] = {0};
input.read((char*)magic, sizeof(magic));
const unsigned char code[4] = { 0xab, 0xcd, 0xef, 0x00 };
if(equal(code, code+sizeof(code), magic))
cout << "It's my File!" << endl;
else
cout << "Unknown File!" << endl;
它与memcmp()
版本非常相似,但它可以与任何容器一起使用,而不仅仅是char的数组。
在线演示