【问题标题】:How do I get the integer value of a char in C++?如何在 C++ 中获取 char 的整数值?
【发布时间】:2008-10-07 18:00:37
【问题描述】:

我想将存储在一个 32 位无符号整数中的值,放入四个字符中,然后将每个字符的整数值存储在一个字符串中。

我认为第一部分是这样的:

char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;

【问题讨论】:

  • 十进制、八进制、十六进制还是二进制?
  • 您的问题和标题似乎很奇怪,而且都不够精确。您能否重述一遍以更清楚?
  • 这在国际环境中似乎非常脆弱,其中一个字符实际上是多个字节的 unicode...

标签: c++ bit-manipulation endianness


【解决方案1】:

如果你真的想先提取单个字节:

unsigned char a = orig & 0xff;
unsigned char b = (orig >> 8) & 0xff;
unsigned char c = (orig >> 16) & 0xff;
unsigned char d = (orig >> 24) & 0xff;

或者:

unsigned char *chars = (unsigned char *)(&orig);
unsigned char a = chars[0];
unsigned char b = chars[1];
unsigned char c = chars[2];
unsigned char d = chars[3];

或者使用一个无符号长整数和四个字符的联合:

union charSplitter {
    struct {
        unsigned char a, b, c, d;
    } charValues;

    unsigned int intValue;
};

charSplitter splitter;
splitter.intValue = orig;
// splitter.charValues.a will give you first byte etc.

更新:正如 friol 指出的,解决方案 2 和 3 不是字节序不可知的; abcd 代表的字节取决于 CPU 架构。

【讨论】:

  • 解决方案 2 和 3 不正确(它们会在不同的机器上给出不同的结果)。
【解决方案2】:

假设“orig”是一个包含您的值的 32 位变量。

我想你想做这样的事情:

unsigned char byte1=orig&0xff;
unsigned char byte2=(orig>>8)&0xff;
unsigned char byte3=(orig>>16)&0xff;
unsigned char byte4=(orig>>24)&0xff;

char myString[256];
sprintf(myString,"%x %x %x %x",byte1,byte2,byte3,byte4);

顺便说一句,我不确定这是否总是正确的。 (编辑:确实,它是字节序正确的,因为位移操作不应该受到字节序的影响)

希望这会有所帮助。

【讨论】:

  • 这将在大小端机器上为您提供相同的答案。
  • 您可能希望在该格式字符串中使用“%d %d %d %d”或“%x %x %x %x”。
【解决方案3】:

使用union。 (这里要求的是示例程序。)

    #include <<iostream>>
    #include <<stdio.h>>
    using namespace std;

    union myunion
    {
       struct chars 
       { 
          unsigned char d, c, b, a;
       } mychars;

        unsigned int myint; 
    };

    int main(void) 
    {
        myunion u;

        u.myint = 0x41424344;

        cout << "a = " << u.mychars.a << endl;
        cout << "b = " << u.mychars.b << endl;
        cout << "c = " << u.mychars.c << endl;
        cout << "d = " << u.mychars.d << endl;
    }

正如 James 所说,这是特定于平台的。

【讨论】:

  • 这样做的问题是你会在不同字节序的系统上得到不同的结果。
【解决方案4】:

不完全是:

char a = orig & 0xff;
orig >>= 8;
char b = orig & 0xff;
orig >>= 8;
char c = orig & 0xff;
orig >>= 8;
char d = orig & 0xff;

不确定您所说的“将这些值中的每一个的整数值存储到一个字符串中是什么意思。您想将0x10111213 变成"16 17 18 19",还是什么?

【讨论】:

  • 一旦我有了字符,我想打印它们的整数值
  • @Clayton,用完全相同的词以稍微不同的顺序重述问题并不是我所说的“澄清”
【解决方案5】:

十六进制:

sprintf(buffer, "%lX", orig);

十进制:

sprintf(buffer, "%ld", orig);

使用snprintf 避免缓冲区溢出。

【讨论】:

  • 或者使用流操作符。这被标记为 C++ 问题。
猜你喜欢
  • 2015-12-30
  • 1970-01-01
  • 2015-09-14
  • 2021-10-22
  • 2023-01-23
  • 2021-07-03
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
相关资源
最近更新 更多