我正在使用 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 50
或 FF D8
- 我将忽略其他所有内容。
通过使用printf我通过一些图片验证:
printf("%x", bytearray_[0] & 0xff);
printf("%x", bytearray_[1] & 0xff);
我得到了:lenna.png
的 8950
和 cat.jpg
的 ffd8
。
我知道我正在寻找两个 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/