我正在尝试处理一个简单的图像加密项目,我想问几个问题。
我是否应该将ifstream
中的每个字节数据存储到我的代码中的字符中?
打印的每个字节都是一个奇怪的符号(这是正确的),但为什么在打印时添加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 :(得分:3)
当您使用小于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
的别名(分别),但使用别名可以为您的代码的读者提供更多信息。