2010-10-19 13 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

相關問題