我正在构建一条消息以通过网络发送一个 24 位数字。对于小端机器,代码是(ptr 是指向消息缓冲区的指针):
*ptr++ = (num >> 16) & 0xFF;
*ptr++ = (num >> 8) & 0xFF;
*ptr++ = (num) & 0xFF;
(因此,如果 num0、num1、num2 和 num3 是组成 num 的各个字节,则消息将被编码为num2|num1|num0
。)
num2|num1|num0
在大端机器上编码的代码应该是什么?
我正在构建一条消息以通过网络发送一个 24 位数字。对于小端机器,代码是(ptr 是指向消息缓冲区的指针):
*ptr++ = (num >> 16) & 0xFF;
*ptr++ = (num >> 8) & 0xFF;
*ptr++ = (num) & 0xFF;
(因此,如果 num0、num1、num2 和 num3 是组成 num 的各个字节,则消息将被编码为num2|num1|num0
。)
num2|num1|num0
在大端机器上编码的代码应该是什么?
The question here is, in what byte order shall the message be sent/constructed ? Because whether you are on a little or big endian machine doesn't matter with respect to num
, as you're already dividing num
into individual bytes in an endian-agnostic way.
The code you've posted stores 24 bits of num
in big endian (aka network byte order). So if that's what you want you're already done. If you want to store it in big little instead, just reverse the order:
*ptr++ = (num) & 0xFF;
*ptr++ = (num >> 8) & 0xFF;
*ptr++ = (num >> 16) & 0xFF;
无论字节顺序如何,您的代码都是可移植的。移位运算符>>
<<
使用值,而不是表示。
int main(int argc, char** argv) {
int a, b;
a = 0x0f000000; // Contain 32 bit value
printf("before = %d\n", a);
b = a & (~0xff000000); // convert the last 8 bits to zero so we got only 24 bit value in b
printf("After = %d\n", b);
return (EXIT_SUCCESS);
}
有一个数字包含 32 位值,但数字 b 仅包含 24 位,从最低有效位开始。这不依赖于字节顺序,因为按位运算符不适用于内存表示。
所以你可以使用
num = num & (~0xff000000);
获取最后的 24 位值。
在接收机器中,无论字节顺序如何,如果您以与它们存储在 ptr 中的相同顺序接收它们,则按如下方式组装它们:
num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]);