繁体   English   中英

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

[英]C++ read and edit jpg file using 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总是得到一个数字。 如何正确增加这些值,以便以后可以将其更改回?

感谢您的任何帮助。

当您使用小于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_tuint8_t 固定整数类型代替char 在受支持的平台上(这几乎是所有这些天),它们分别是有signed charunsigned char的别名,但是使用别名对您的代码读者更有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM