Я использую G ++, но и хотел бы поддержать Clang/OSX для следующих целей:C++/г ++ сравнения СЛОВА СНАКА для магических чисел
я загрузить изображение из файла, и разобрать его в вектор типа 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
.
Я понимаю, что я ищу WORD (2 бита) внутри двух CHAR (байт), и что самый простой способ, чтобы подтвердить, что будет через XOR:
bool png = (&bytearray_[0]^'89') && (&bytearray_[1]^'50');
bool jpg = (&bytearray_[0]^'ff') && (&bytearray_[1]^'d8');
Рассмотренные выше, конечно, не работает, я сравниваю CHAR с int
, тогда как мне нужно извлечь СЛОВО. Я также понимаю, что это может быть компилятор/платформа, у меня нет проблем с ограничением кода на GCC/Linux и/или CLANG/OSX.
- Как я могу сделать такое сравнение в C++?
- Должен ли я отбрасывать CHAR к СЛОМУ или передавать литерал WORD в CHAR?
Что случилось с просто 'bytearray_ [0] == 0x89 && bytearray_ [1] == 0x50'? Вы делаете это слишком сложно. –
@IgorTandetnik: раздел _answer_ внизу, bro: ↓↓↓↓↓↓↓↓↓ –
У меня просто не было понятия, как это сделать в C++ –