繁体   English   中英

C ++将char转换为int

[英]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.

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