2011-03-31 84 views
0

我想如下轉換的32位無符號整數:轉換字節順序的C代碼?


Input = 0xdeadbeef 

Output = 0xfeebdaed 

謝謝。

+2

您給出的示例將數字翻轉爲4位塊,而不是完整的8位字節。 – 2011-03-31 06:04:38

+2

這真的是你想要做的嗎?你已經扭轉了半字節,而不是字節...... endianess? – 2011-03-31 06:06:08

回答

4

這就是而不是的字節序轉換。輸出應該是0xEFBEADDE,而不是0xFEEBDAED。 (只有字節被交換,並且每個字節是2個十六進制數字。)

對於小端和大端之間的轉換,請看_byteswap_ulong

+3

或者在* nix系統上也許是'htonl'(注意'htonl'在大端系統上是不可用的)。 – 2011-03-31 06:09:22

+0

我發現'htobe16','htole16','le16toh','be16toh'和32位版本在編寫跨平臺代碼時更加有用(和明確)。如果給定的平臺沒有它們,很容易將名稱映射到平臺所具有的任何平臺上。 – tomlogic 2011-03-31 18:10:04

+0

@tomlogic:那些不能在big-endian系統上工作,但是......你不能像重新設置_byteswap_ulong一樣簡單嗎?它只是一個'#define' ... – Mehrdad 2011-03-31 18:13:52

1

半字節反轉的一般過程是:

(第(i & 0xF0000000)>> 28)| ((i & 0xF000000)>> 20)| ((i & 0xF00000)>> 12) | ..... | ((我& 0xF)< < 28)

面膜,移位,或(我希望我右邊的數字):

  1. 提取你感興趣的取與數量的部分(&)與面具。
  2. 使用>>和< <操作將其切換到目標位置。
  3. 通過ORing(|)構造新的值。

如果你想重新排序字節,你將使用0xFF進行掩碼。正如大家所說,這可能是你想要的,如果你正在尋找罐裝版本,請按照其他人的建議。