繁体   English   中英

C++ 从文件中读取并比较幻数

[英]C++ read and compare magic number from file

我有我想用 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[]-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,这也始终是正确的字节序列。

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

好的老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...
}

这不能跨不同平台移植,但可以在简单的情况下使用,提供粗体红色闪烁字体的注释,说BEWARE: use only on big endian system

如果您知道平台的字节序,则可以使用uint32_t变量来执行此操作。

对于小端系统,请使用:

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()版本非常相似,但它适用于任何容器,而不仅仅是字符数组。

在线演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM