C ++将四个不合法的字符转换为一个不带符号的int

时间:2018-11-13 21:09:45

标签: c++ casting

在我的c ++程序中,我有一个包含四个unsigned char成员的结构

struct msg
{
    unsigned char zero; unsigned char one; unsigned char two; unsigned char three;
}

并创建了一个struct数组

msg myMsg[4] = {{0x11,0x22,0xAA,0xCC},{...},{...},{...}};

现在在函数中,我想返回此数组的索引作为unsigned int

unsigned int procMsg(int n){
  return myMsg[n]; // of course this is worng
}

类似0xCCAA2211

的值

2 个答案:

答案 0 :(得分:1)

考虑这一点:

这样的消息:{0x01, 0x01, 0x01, 0x01}可以解析为

00000001 00000001 00000001 00000001(bin)= 16.843.009(dec)

所以您只需要取出每个字符并根据其位置移动它们 即

  

char0完全不移位

     

char1向左移动8个位置(或乘以2 ^ 8)

     

char2向左移动16个位置(或乘以2 ^(8 * 2))

     

char3向左移动24个位置(或乘以2 ^(8 * 3))

unsigned int procMsg(Message &x)
{
    return (x.three << 24) |
           (x.two << 16) |
           (x.one << 8) |
           x.zero;
}

int main(int argc, char *argv[])
{
                         //0     1     2     3
    Message myMsg[4] = {{0x01, 0x01, 0x01, 0x01},  //00000001 00000001 00000001 00000001 = 16.843.009
                        {0xFF, 0x00, 0xAA, 0xCC},  //00000001 00000001 00000001 00000001 = 3.433.693.439
                        {0x01, 0x00, 0x00, 0x00},  //00000001 00000001 00000001 00000001 = 1
                        {0x00, 0x00, 0x00, 0x00}   //00000000 00000000 00000000 00000000 = 0
                       };

    for (int i = 0; i<4; i++)
    {
        Message x = myMsg[i];
        std::cout << "res: " << procMsg(myMsg[i]) << std::endl;
    }

    return  0;

}

答案 1 :(得分:1)

您可以使用移位:

uint32_t little_endian;
uint32_t big_endian;
//...
big_endian = myMsg[0].zero << 24
           | myMsg[0].one  << 16
           | myMsg[0].two  <<  8
           | myMsg[0].three;
little_endian = myMsg[0].three << 24
                myMsg[0].two   << 16
                myMsg[0].one   <<  8
                myMsg[0].zero;

如您所见,对于多字节整数,有两种常规排序:大字节序和小字节序。 Big Endian首先具有最高有效字节(MSB)。 Little Endian首先具有最低有效字节(LSB)。

通常,以上方法比使用循环更有效。