c ++ / g ++将魔术数字与WORD和CHAR进行比较

时间:2016-01-30 20:52:33

标签: c++ gcc clang

我正在使用G ++,但也想支持CLANG / OSX:

我从文件中加载图片,并将其解析为char类型定义为byte的向量。这是有效的,我可以保存它,通过套接字发送,等等。

我的(故意为最小)类picture实际上是围绕这些字节。

class picture
{
public:
    typedef char byte;

    picture(std::string filename)
    {
        std::ifstream bytestream(filename, 
                                 std::ios::in | std::ios::binary | std::ios::ate);
        if (bytestream.is_open())
        {
            bytestream.seekg(0, std::ios_base::end);
            std::streampos fileSize = bytestream.tellg();
            bytearray_.resize(fileSize);
            bytestream.seekg(0, std::ios_base::beg);
            bytestream.read(&bytearray_[0], fileSize);
        }
    }

private:
    std::vector<byte> bytearray_;
}

但是,我需要能够确定这是PNG,JPG还是其他类型的文件。 magic number来拯救:我只是想找出前两个字节是否包含一系列单词89 50FF D8 - 我将忽略的其他所有内容。

通过使用printf我通过使用一些图片进行了验证:

printf("%x", bytearray_[0] & 0xff);
printf("%x", bytearray_[1] & 0xff);

我得到8950 lenna.pngffd8 cat.jpg

我明白我在两个CHAR(字节)中寻找一个WORD(2位), 确认它的最简单方法是通过XOR:

bool png = (&bytearray_[0] ^ '89') && (&bytearray_[1] ^ '50');
bool jpg = (&bytearray_[0] ^ 'ff') && (&bytearray_[1] ^ 'd8');

上述当然不起作用,我将CHAR与int进行比较,而我需要提取WORD。 我也明白这可能是编译器/平台特定的,我没有问题将代码限制在GCC / Linux和/或CLANG / OSX。

  • 如何在C ++中进行这样的比较?
  • 我应该将CHAR转换为WORD,还是将WORD字面值转换为CHAR?

1 个答案:

答案 0 :(得分:2)

你不需要任何这种复杂性,也不需要任何演员。

只需对各个字节值进行简单比较即可:

const bool is_png = (bytearray_[0] == 0x89 && bytearray_[1] == 0x50);
const bool is_jpg = (bytearray_[0] == 0xFF && bytearray_[1] == 0xD8);