2010-10-19 39 views
2

我正在构建一条消息,通过网络发送一个24位数字。 对于小端机器,代码是(PTR是指针到消息缓冲液):如何在从大型机器(C)上的4字节整数读取后写入24位消息?

*ptr++ = (num >> 16) & 0xFF; 
*ptr++ = (num >> 8) & 0xFF; 
*ptr++ = (num)  & 0xFF; 

(因此,如果NUM0,NUM1,NUM2和NUM3是构成NUM的单个字节,该消息将被编码的作为num2|num1|num0。)

在大型机器上编码num2|num1|num0的代码应该是什么?

回答

1

你的代码是便携式的。移位运算符>><<使用值而不是表示。

3

这里的问题是,以什么字节顺序发送/构造消息?因为无论你是在一台小型还是大型机器上,与num无关,因为你已经将num以不符合端点的方式分成单独的字节。

您发布的代码以big endian(又名网络字节顺序)存储num的24位。所以,如果这就是你想要的,那么你已经完成了。如果你想将其存储在大一点,而不是,只是颠倒顺序:不管字节序的

*ptr++ = (num)  & 0xFF; 
*ptr++ = (num >> 8) & 0xFF; 
*ptr++ = (num >> 16) & 0xFF; 
0

在接收机,而不管字节序的,如果收到它们在相同的顺序,因为它们被存储在PTR,装配它们是这样的:

num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]); 
+0

非常感谢您的回复。如果总结回答如下是正确的: – Bikash 2010-10-19 09:11:33

+0

@Bikash,你打得太早? :-) – 2010-10-19 09:12:55

+0

1.我的协议要求消息的字节顺序是big endian – Bikash 2010-10-19 09:13:40

0
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位值。

+0

0x00ffffff有什么问题吗? – Secure 2010-10-19 11:12:51

+0

这也是工作,所以时间不需要不运算符(〜)。那更好的解决方案。 – 2010-10-19 13:06:24

相关问题