在不同的系統中,當最最基礎的資料存在問題的時候,這是最讓人頭疼的問題。但是,世界就是愛和我們開玩笑,不是麼?在晶元中,有兩種方式儲存資料:
一般小端,會用在資料的儲存上,而大端用在資料的傳輸。前者也叫主機序,後者也叫網路位元組序,當然,也不是絕對。至於用什麼,當然根據自己的愛好了,當然和協議也有很大的關係。
這其中,涉及到很多問題,主機序列是否和網路位元組序匹配,這裡,分開說明。
可以利用如下的巨集來進行轉換
#define lit_big_transshort(a_data) (((a_data) & 0x00ff) << 8 | ((a_data) & 0xff00) >> 8)
#define lit_big_translong(a_data) (((a_data) & 0xff000000) >> 24 | ((a_data) & 0x000000ff) << 24)
#define lit_big_transword(a_data) lit_big_transshort(a_data)
#define lit_big_transint(a_data) (lit_big_translong(a_data) | (lit_big_transshort((a_data) >> 8) << 8))
value = *(uint*)&data[0];
value = lit_big_transint(value);
num = lit_big_transint(num);
data[0] = *(uchar*)#
某些晶元,由於架構的原因,並不支援奇數字址指標的某些資料獲取。所以,如果通過這種暴力的指標型別轉換是存在問題的,所以,只有提供如下的函式來進行轉換。最好的解決辦法,就是自己編寫乙個類似於網路位元組序轉主機位元組序的函式。
以下是這幾個函式:
大小端轉換
大小端轉換方法 include include define tranverse16 x uint16 x 0xff00 8 uint16 x 0x00ff 8 define tranverse32 x uint32 x 0xff000000 24 uint32 x 0x00ff0000 8 uin...
大小端轉換
short型別 public static short reverseushort short value 簡單分析一下 short型別占用16位,也就是兩個位元組,大小端只需要將兩個位元組互換一下就行。採用位操作,通過和 0x00ffu進行與運算,拿到第二個位元組的內容,然後左移8位,將其放置到第...
大小端轉換的例子
define constant swab32 x uint32 t uint32 t x 0x000000ffu 24 uint32 t x 0x0000ff00u 8 uint32 t x 0x00ff0000u 8 uint32 t x 0xff000000u 24 define le32 to...