对不起,我的英语不好。我需要构建将十六进制转换为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()一起使用,但它不起作用。 P.S不建议使用stoi(),因为我需要使用较早的C ++进行此作业。预先感谢,祝您有美好的一天;)
答案 0 :(得分:2)
您可以使用int
将十六进制值直接存储在std::hex
中。
int b;
ifstream data("U1.txt");
data >> std::hex >> b;
答案 1 :(得分:0)
由于这些编码使用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;
现在,您获得了value
的低24位中的值。您需要选择该值的各个R,G和B部分。那很简单。要获得低8位,只需屏蔽掉较高的8位:
std::cout << (value & 0xFF) << '\n';
要获取接下来的8位,请移位并屏蔽:
std::cout << ((value >> 8) & 0xFF) << '\n';
自然,要获得高8位,请移位并屏蔽:
std::cout << ((value >> 16) & 0xFF) << '\n';
答案 2 :(得分:-1)
一个相当简单但可行的答案是将所有字符减48,因为那是数字以ASCII开头的字符。这也是为什么您获得816的原因:
48*16+48 = 816