c++/g++ 比较 WORD 和 CHAR 的魔数(Magic Number)

标签 c++ gcc clang

我正在使用 G++,但也希望在以下方面支持 CLANG/OSX:

我从一个文件中加载一张图片,并将其解析为一个定义为 byte 的 char 类型的 vector 。这行得通,我可以保存它,通过套接字发送它,等等。

我的(有意最小化)类 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);

我得到了:lenna.png8950cat.jpgffd8

我知道我正在寻找两个 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?

最佳答案

您不需要任何这种复杂性,也不需要任何转换。

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

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

关于c++/g++ 比较 WORD 和 CHAR 的魔数(Magic Number),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35106968/

相关文章:

linux - 安装依赖 SciKit/NumPy/SciPy

c++ - 使用 -std=c++0x 标志编译时,Unix 宏变得未定义

templates - GCC(/Clang) : Merging functions with identical instructions (COMDAT folding)

c++ - 铛不工作。 undefined symbol 错误。代码在 gcc 中编译良好

c++ - 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?

c++ - 正在使用命名空间标准;强制的

c++ - 更改 lParam 指向的值

c - 使用内联汇编在 C 中添加值

C++11 std::shared_ptr + boost::序列化

c++ - openCV中2个多边形的交叉区域