C ++将char转换为int

时间:2019-04-03 14:52:41

标签: c++

对不起,我的英语不好。我需要构建将十六进制转换为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 ++进行此作业。预先感谢,祝您有美好的一天;)

3 个答案:

答案 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