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/

相关文章:

sql - 如何检查数据库的架构

gcc - 在MinGw下构建完整的gcc

c++ - Clang - 获取 SubstTemplateTypeParm 完整模板信息

c++ - 在我的 Mac 上编译时,当我使用 "gcc"编译但不使用 clang++ 时出现此错误

c++ - Boost - 在图中查找最大匹配边

c++ - 如何找到某个变量旁边存储的内容

使用 bison 生成的文件进行循环依赖解析

c++ - clang 编译器卡在 Windows 上

c++ - WinPcap block 数据包

C++ XCODE ld : symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)