我正在使用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 50
或FF D8
- 我将忽略的其他所有内容。
通过使用printf我通过使用一些图片进行了验证:
printf("%x", bytearray_[0] & 0xff);
printf("%x", bytearray_[1] & 0xff);
我得到8950
lenna.png
和ffd8
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。
答案 0 :(得分:2)
你不需要任何这种复杂性,也不需要任何演员。
只需对各个字节值进行简单比较即可:
const bool is_png = (bytearray_[0] == 0x89 && bytearray_[1] == 0x50);
const bool is_jpg = (bytearray_[0] == 0xFF && bytearray_[1] == 0xD8);