2014-01-05 128 views
0

所以我正在從VC++移植一小段代碼到.NET。我一直是一個VB人,在C#中涉獵不多,對VC++幾乎沒有任何認識。是的,我知道,嘗試使用一種你一無所知的語言來代碼轉換可能是一個糟糕的主意,但我並不認爲花時間學習語言的輸入和輸出是爲了移植一個語言幾百行代碼。我已經學會了足夠多的東西來學習它,但我仍然不清楚哪些東西。這裏是VC++代碼:VC++到VB.NET代碼轉換

#define ES16(_val) \ 
((u16)(((((u16)_val) & 0xff00) >> 8) | \ 
     ((((u16)_val) & 0x00ff) << 8))) 

#define ES32(_val) \ 
((u32)(((((u32)_val) & 0xff000000) >> 24) | \ 
     ((((u32)_val) & 0x00ff0000) >> 8) | \ 
     ((((u32)_val) & 0x0000ff00) << 8) | \ 
     ((((u32)_val) & 0x000000ff) << 24))) 

#define ES64(_val) \ 
((u64)(((((u64)_val) & 0xff00000000000000ull) >> 56) | \ 
     ((((u64)_val) & 0x00ff000000000000ull) >> 40) | \ 
     ((((u64)_val) & 0x0000ff0000000000ull) >> 24) | \ 
     ((((u64)_val) & 0x000000ff00000000ull) >> 8) | \ 
     ((((u64)_val) & 0x00000000ff000000ull) << 8) | \ 
     ((((u64)_val) & 0x0000000000ff0000ull) << 24) | \ 
     ((((u64)_val) & 0x000000000000ff00ull) << 40) | \ 
     ((((u64)_val) & 0x00000000000000ffull) << 56))) 

有人可以解釋這是怎麼回事嗎?也許可以提供一些關於如何在VB.NET中重寫的內容(儘管如果我知道發生了什麼,我肯定可以自己重寫它,哈哈)。

一如既往,在此先感謝大家。

+0

在我看來,它是交換字節/字/雙字順序(字節順序轉換) – Zenilogix

+1

這是在小端和大端之間轉換的字節反轉代碼。您可以使用BitConverter.GetBytes()和Array.Reverse()或使用Skeet的MiscUtil。 –

回答

0

這些宏在整型變量中反轉字節:short,unsigned short,int,unsigned int,long long和unsigned long long(假設它們具有相應的16,32和64位大小)。 例如,如果有一些unsigned short類型的值爲0x1234的變量,則應用第一個宏ES16(0x1234)後,結果將爲0x3412。

,這將是更加清晰考慮一步STEAP宏觀

((U16)_Val)的作用&爲0xFF00)將等於從0x1200 然後

從0x1200 >> 8將等於到0×0012

((U16)_val)&設爲$ 00FF)將等於0x0034

然後

0x0034 < < 8將等於0x3400

,最後

×0012 | 0x3400將導致0x3412