在我的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
答案 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)。
通常,以上方法比使用循环更有效。