我无法弄清楚这个功能是如何运作的:
void print3bytes(unsigned char s[],unsigned len)
{
unsigned char *end;
for(end=s+len-len%3; s<end; s=s+3 )
printf("%x ", s[0]|s[1]<<8 | s[2]<<16);
putchar('\n');
}
这对于这个例子是如何工作的:
int main(void)
{
unsigned char s[] = "\x12\x34\x56\x78\x9A\xBC\xDE\xFF";
print3bytes(s, 8);
return 0;
}
有人可以解释一下吗?
答案 0 :(得分:3)
表达式结合了:
s[0]
s[1]
向左移位('&lt;&lt;&lt;')8位s[2]
向左移位(<<
)16位使用按位 - 或(|
)。
因此,当s
包含0x12,0x34,0x56作为其第一个字节时,它会计算
0x12 | (0x34 << 8) | (0x56 << 16)
^ ^ ^
| | |
s[0] s[1] s[2]
是
0x12 | 0x3400 | 0x560000
或0x563412
。基本上它是从s
开始在little-endian format中解包(解码,反序列化,解编组等)24位整数。
答案 1 :(得分:1)
s[0] | s[1]<<8 | s[2]<<16
假设s [2]为0xff(255),s [1]为0xaa(170),s [0]为0x11(17)。如果你移动s [2] 16位,你得到:
0xff0000
如果你将s [1]移动8位,你得到:
0x00aa00
如果您或这些人一起得到
0xffaa00
或者用s [0]:
0xffaa11