[英]C++ convert char to int
对不起,我的英语不好。 我需要构建将十六进制转换为RGB的应用程序。 我的文件U1.txt中包含以下内容:
2 3
008000
FF0000
FFFFFF
FFFF00
FF0000
FFFF00
和我的代码块应用程序:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a;
int b;
string color;
ifstream data("U1.txt");
ofstream result("U1result.txt");
data >> a;
data >> b;
for (int i = 0; i < a * b; i++) {
data >> color;
cout << color[0] * 16 + color[1] << endl;
}
data.close();
result.close();
return 0;
}
这给了我816
。 但是它应该为0。我认为color [0]不是整数,而是一个char并乘以ASCII数字。.我已经尝试了很多方法与atoi,c_str()一起使用,但它不起作用。 PS不建议使用stoi(),因为我需要使用较早的C ++进行此作业。 在此先感谢,祝您有美好的一天;)
您可以使用std::hex
将十六进制值直接存储在int
。
int b;
ifstream data("U1.txt");
data >> std::hex >> b;
由于这些编码使用24位,因此必须从一个至少包含24位的整数类型开始。 对于这种打包和拆包,它实际上应该是未签名的,因此您不会被符号位所困扰。 这意味着使用std::uint_least32_t
,这是最小的无符号类型,可以容纳至少32位。 (是的,24会更合适,但没有至少24种类型; 32是您可以做的最好的事情)。
如果您的编译器不提供这些固定宽度类型( std::uint_least32_t
),则可以使用unsigned long
。 必须至少为32位宽。 它可能更大,并且使用std::uint_least32_t
的原因是,例如,您的编译器可能具有32位整数,在这种情况下, unsigned int
宽度为32位。 但是您不能指望这一点,因此请使用固定宽度类型或使用unsigned long
来确保您有足够的位。
由于字符输入是用十六进制编码的,因此您需要告诉输入系统将它们解释为十六进制值。 所以:
std::uint_least32_t value;
data >> std::hex >> value;
现在你已经在低24位获得值value
。 您需要选择该值的各个R,G和B部分。 那很简单。 要获得低8位,只需屏蔽掉高8位即可:
std::cout << (value & 0xFF) << '\n';
要获取接下来的8位,请移位并屏蔽:
std::cout << ((value >> 8) & 0xFF) << '\n';
当然,要获得高8位,请移位并屏蔽:
std::cout << ((value >> 16) & 0xFF) << '\n';
一个相当简单但可行的答案是将所有字符减48,因为那是数字以ASCII开头的字符。 这也是为什么您获得816的原因:
48*16+48 = 816
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.