思路:聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性就可以輕鬆地獲得了
cpu對記憶體採用little-endian還是big-endian模式讀寫。
給出c**,linux其實也差不了多少
#include
using namespace std;
union judge
; judge flag;
int main()
u;u.a = 1;
if (u.ch == 1)
printf("littel endian\\n");
else
printf("big endian\\n");
利用聯合體的特點,資料成員共享記憶體空間,union中元素的起始位址都是相同的——位於聯合的開始。 用char來擷取感興趣的位元組。
四、需要考慮大小端(位元組順序)的情況
1、所寫的程式需要向不同的硬體平台遷移,說不定哪乙個平台是大端還是小端,為了保證可移植性,一定提前考慮好。
2. 在不同型別的機器之間通過網路傳送二進位制資料時。 乙個常見的問題是當小端法機器產生的資料被傳送到大端法機器或者反之時,接受程式會發現,字(word)裡的位元組(byte)成了反序的。為了避免這類問 題,網路應用程式的**編寫必須遵守已建立的關於位元組順序的規則,以確保傳送方機器將它的內部表示轉換成網路標準,而接受方機器則將網路標準轉換為它的內部標準。
3. 當閱讀表示整數的位元組序列時。這通常發生在檢查機器級程式時,e.g.:反彙編得到的一條指令:
80483bd: 01 05 64 94 04 08 add �x, 0x8049464
3. 當編寫強轉的型別系統的程式時。
例1:如寫入的資料為u32型,但是讀取的時候卻是char型的:
如:0x1234, 大端讀取為12時,小端獨到的是34。
例2:將buffer中的數轉換為整型:
如:int src = 0x1234
memcpy(buffer, src, sizeof(int));
大端:buffer[4] = ;
小端:buffer[4] = ;
六、提高程式的可移植性
使用巨集編譯
#ifdef little_endian
//小端的**
#else
//大端的**
#endif
七、大、小端之間的轉換
1、小端轉換為大端
#include
void show_byte(char *addr, int len)
int i;
for (i = 0; i >= 8;
return result;
int main(void)
int i;
int ret;
i = 0x1234567;
show_byte((char *)&i, sizeof(int));
ret = endian_convert(i);
show_byte((char *)&ret, sizeof(int));
return 0;
判斷大小端
int i 1 char p char i if p 1 printf 1 else printf 2 大小端儲存問題,如果小端方式中 i佔至少兩個位元組的長度 則i所分配的記憶體最小位址那個位元組中就存著1,其他位元組是0.大端的話則1在i的最高位址位元組處存放,char是乙個位元組,所以強制將c...
大小端判斷
大端模式 big endian 字資料的高位元組儲存在低位址中,而字資料的低位元組則存放在高位址中。小端模式 little endian 字資料的高位元組儲存在高位址中,而字資料的低位元組則存放在低位址中。注意 個人覺得只需記住小端模式低位元組存放在低位址 在這我只總結了兩種方式的大小端判斷 1 採...
CPU大小端判斷
big endian 認為第乙個位元組是最高位位元組 按照從低位址到高位址的順序存放資料的高位位元組到低位位元組 大端 而little endian 則相反,它認為第乙個位元組是最低位位元組 按照從低位址到高位址的順序存放資料的低位位元組到高位位元組 小端 用 c程式設計實現判斷,如下 測試你的機器...