C ++使用ifstream读取和编辑jpg文件

时间:2016-04-12 06:03:21

标签: c++ binaryfiles

我正在尝试处理一个简单的图像加密项目,我想问几个问题。

  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;
    }
    
  3. 输出:

    Original:  å
    Result after adding: -112
    
    Original:  Æ
    Result after adding: -100
    
    Original:
    Result after adding: 12
    

    如您所见,添加10总会产生一个数字。如何正确递增这些值,以便我以后可以更改它?

    感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

当您使用小于int的类型(如您的情况下为char)执行算术运算(如加法)时,该值将提升int,操作使用两个int值完成。

所以表达式data[i] + 10相当于static_cast<int>(data[i]) + 10

详细了解integral promotionarithmetic operator conversions

至于如何解决问题,首先必须确保操作的结果实际适合char。如果您阅读的字节为127并添加了10,该怎么办?然后结果超出signed char的界限(这似乎就是你所拥有的)。

如果结果超出界限,那么你可以直接投射它:

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

作为一个小小的注释,如果您正在阅读二进制数据,那么您并不是在阅读字符,因此我建议使用fixed-with integer type之类的int8_tuint8_t代替char。在支持的平台上(几乎所有这些天),它们只是signed charunsigned char的别名(分别),但使用别名可以为您的代码的读者提供更多信息。