2016-04-12 4 views
1

Я пытаюсь работать над простым проектом шифрования изображений, и у меня есть несколько вопросов, которые я хочу задать.C++ чтение и редактирование файла jpg с использованием ifstream

  1. Должен ли я хранить каждый байт данных из ifstream в персонажа, как я сделал в моем коде?

  2. Каждый байт напечатан - это странный символ (это правильно), но почему добавление 10 (int) к этому всегда приводит к числу при печати?

    int main() { 
    
        vector <char> data; // Stores each byte from image.jpg 
    
        ifstream fileIn("image.jpg", ios::binary); 
    
        int i = 0; // Used for accessing each item in data vector 
    
        while (fileIn){ 
    
          //Add each character from the image file into the vector 
          data.push_back(fileIn.get()); 
    
          cout << "Original: " << data[i] << endl; // Print each character from image.jgp 
    
          cout << "Result after adding: " << data[i] + 10 << endl; // This line is where I need help with 
    
          i++; 
    
          system("pause"); 
        } 
    
        fileIn.close(); 
    
        system("pause"); 
        return 0; 
    } 
    

Выход:

Original: å 
Result after adding: -112 

Original: Æ 
Result after adding: -100 

Original: 
Result after adding: 12 

Как вы можете видеть, добавление 10 всегда приводит к ряду. Как я правильно увеличиваю эти значения, чтобы впоследствии изменить их?

Благодарим за помощь.

+0

Для уточнения, вы фактически ничего не делаете с фактическими данными изображения JPEG? Просто случается так, что ваш входной файл является файлом изображения JPEG? –

ответ

2

При выполнении арифметических операций (как дополнение) со значением типа, который меньше, чем int (как char в вашем случае), то значение будет способствовало к int и операция осуществляется с помощью двух int значения.

Таким образом, выражение data[i] + 10 эквивалентно static_cast<int>(data[i]) + 10.

Подробнее о integral promotion и arithmetic operator conversions.


А как решить вашу проблему, сначала вы должны убедиться, что результат операции на самом деле вписывается в char. Что делать, если байт, который вы прочитали, составляет 127, и вы добавляете 10? Тогда результат выходит за рамки signed char (что, кажется, то, что у вас есть).

Если результат не вне границ, то вы можете просто бросить его:

char result = static_cast<char>(data[i] + 10); 

В маленькой боковой ноте, если вы читаете двоичные данные, вы на самом деле не читаете символов, поэтому я предлагаю использовать fixed-with integer type как int8_t или uint8_t вместо char. На поддерживаемых платформах (это примерно все эти дни) они просто псевдонимы для signed char и unsigned char (соответственно), но использование псевдонимов более информативно для читателей вашего кода.

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