[英]C++ read and edit jpg file using ifstream
我正在尝试一个简单的图像加密项目,我想问几个问题。
是否应该像我在代码中那样将来自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总是得到一个数字。 如何正确增加这些值,以便以后可以将其更改回?
感谢您的任何帮助。
当您使用小于int
的类型的值(如您的情况下的char
)进行算术运算(如加法)时,该值将提升为int
并且该操作使用两个int
值完成。
因此,表达式data[i] + 10
等效于static_cast<int>(data[i]) + 10
。
至于如何解决您的问题,首先必须确保操作的结果确实适合char
。 如果您已读取的字节是127
并加上10
怎么办? 然后结果超出了已signed char
(似乎就是您所拥有的signed char
)的范围。
如果结果不超出范围,则可以将其强制转换为:
char result = static_cast<char>(data[i] + 10);
作为一个小小的注解,如果您正在读取二进制数据,那么您实际上并不是在读取字符 ,因此我建议使用诸如int8_t
或uint8_t
类的固定整数类型代替char
。 在受支持的平台上(这几乎是所有这些天),它们分别是有signed char
和unsigned char
的别名,但是使用别名对您的代码读者更有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.