2016-01-30 2 views
0

Я использую 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?
+1

Что случилось с просто 'bytearray_ [0] == 0x89 && bytearray_ [1] == 0x50'? Вы делаете это слишком сложно. –

+0

@IgorTandetnik: раздел _answer_ внизу, bro: ↓↓↓↓↓↓↓↓↓ –

+0

У меня просто не было понятия, как это сделать в C++ –

ответ

2

Вам не нужна эта сложность, и никаких бросков.

Только простые сравнения отдельных значений байт будет делать:

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

lol эта простой !!! Спасибо :-) –

+0

Я за 3 минуты –

Смежные вопросы