【问题标题】:c++ convert four unsined chars to one unsigned intc++ 将四个 unsined char 转换为一个 unsigned int
【发布时间】:2018-11-14 06:30:48
【问题描述】:

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

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

并创建了一个结构数组

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

现在在一个函数中,我想将该数组的索引作为unsigned int返回

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

类似的值:0xCCAA2211

【问题讨论】:

  • 有理由不做uint32_t ival = myMsg[n].zero | (myMsg[n].one << 8) | (myMsg[n].two << 16) | (myMsg[n].three << 24) 吗?
  • @ChrisD 非常感谢,实际上这就是答案,我是 c/c++ 新手,甚至不知道要搜索什么
  • 酷,我问了这个问题,以防有一些关键的性能原因不使用所有的班次和 ORS。如果有那么@ShafikYaghmour 的答案值得一读,但请注意,您需要确保 struct msg 被打包成 4 个字节而没有任何填充(尽管几乎总是这样)。

标签: c++ casting


【解决方案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 和 Little Endian。 Big Endian 首先具有最高有效字节 (MSB)。 Little Endian 首先具有最低有效字节 (LSB)。

一般来说,上述方法比使用循环更有效。

【讨论】:

    【解决方案2】:

    考虑一下:

    这样的消息:{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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2012-05-06
      • 2011-12-15
      • 2015-01-20
      相关资源
      最近更新 更多