2011-12-13 38 views
13

我正在使用一些遺留代碼,並且我遇到了一個顯然用於在任意長字段(大於ntohl可以處理的字段)上執行網絡字節順序轉換的函數。這實際上是做什麼的? - 瘋狂的C++函數

雖然(或者即使它可以可靠地做到這一點),但我不能很好地理解它是否做了比在msg緩衝區範圍內顛倒字節順序更多的事情。有人可以幫我解決這個問題,並分析它,所以我可以用更容易理解的東西來取代它(或者至少評論它)!

void swapit(unsigned char *msg, int length) { 
    for(;length>0;length--, msg++) { 
    *msg = ((*msg * 0x0802LU & 0x22110LU) | 
      (*msg * 0x8020LU & 0x88440LU)) * 
      0x10101LU >> 16; 
    } 
} 
+3

請參閱http://stackoverflow.com/a/746203/367273其中此功能與許多選擇一起出現。投票在此基礎上結束。 – NPE

+0

呃......我應該把它當作「它是完全安全的,不用擔心嗎?」 –

+1

這取決於你。它顯然值得一個評論(也許是另一個SO問題的鏈接:-)) – NPE

回答

20

要看它是如何工作的,考慮將操作應用於位模式abcdefgh。 我會用.代表0的二進制數,所以非零位表現突出。

第一個子表達式是:

........ ........ abcdefgh 
* ........ ....1... ......1. (0x0802) 
= .....abc defgh..a bcdefgh. 
& ......1. ..1....1 ...1.... (0x22110) 
= ......b. ..f....a ...e.... 

二是:

........ ........ abcdefgh 
* ........ 1....... ..1..... (0x8020) 
= .abcdefg h..abcde fgh..... 
& ....1... 1....1.. .1...... (0x88440) 
= ....d... h....c.. .g...... 

結合它們和由最終常數相乘給出:

......b. ..f....a ...e.... 
| ....d... h....c.. .g...... 
= ....d.b. h.f..c.a .g.e.... 
* .......1 .......1 .......1 (0x10101) 
= ....d.b. h.f..c.a .g.e.... 
+h.f..c.a .g.e.... ........ 
+.g.e.... ........ ........ 
= hgfedcba hgfe.c.a .g.e.... 

最後下移通過16位給出hgfedcba,與原始模式相反。

+0

感謝您的詳細解答,它使它更容易理解:) –

相關問題