大端 小端 與memcpy

2021-09-30 09:41:03 字數 1278 閱讀 2992

關於大端小端 長久以來用處都不是很明顯 可是一旦設計到伺服器中的某些資料傳遞等等的方面的時候就會配合這memcpy出現一些問題

先上程式:

int_8* a = new int_8[10];

a[0] = 0;

a[1] = 0;

a[2] = 0;

a[3] = 13;

a[4] = 0;

a[5] = 0;

a[6] = 0;

a[7] = 0;

int_32 t = 0;

memcpy(&t , a , sizeof(t));

這時候我們把t列印出來看看,小端機器就會看到好幾萬的輸出,這是由於a是代表低位址,對於小端低位址就會被對映到int的低位資料,於是,成為了0x 13 00 00 00,的乙個int 資料,所以如果想輸出為13,那麼就應該寫為a = 13,其餘為0,從而在copy之後,主機讀取int型資料時候就會被對映成為 0x 00 00 00 13 從而正確。這個就可亦理解網路位元組序的工作原理了。

所以當要進行資料封裝和解封裝的時候,最好是按照純memcpy的操作,例如上面的**,不應該逐個賦值,應該直接用memcpy對a指向的記憶體進行寫操作,然後同理利用memcpy對於a指向的記憶體進行讀操作,這樣可以忽略大小端的影響。

void

main()

;//注意這個和上面的 //

在賦值的時候是不一樣的

unsigned

short

usval_1 =0

; unsigned

short

usval_2 =0

; memcpy(

&uival_2, aucval,

sizeof

(uival_2));

usval_1

=(unsigned

short

)uival_1;

//在這截斷 都取得是低位

usval_2

=(unsigned

short

)uival_2;

//在這截斷

printf(

"usval_1: %x\n

", usval_1);

//這又轉化回來

printf(

"usval_2: %x\n

", usval_2);

//這邊又轉化回來} 

uival_2:12 34 56 78  

結果應該是

5678

3412

大端與小端

網際網路使用網路位元組順序採用大端模式進行編址,大端儲存也稱為網路位元組序,因為tcp ip包在網路中傳輸時都要求以這種次序,以其他形式儲存資料的機器 主機位元組順序根據處理器的不同而不同,如powerpc處理器,使用大端模式,而pentuim處理器使用小端模式 則必須在傳送資料之前把首部轉換成網路...

大端與小端

端模式 endian 的這個詞出自 jonathan swift 書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為 big endian 從尖頭開始將雞蛋敲開的人被歸為 littile endian 小人國的內戰就源於吃雞蛋時是究竟從大頭 big ...

大端與小端

大端表示跟小端表示這兩者的具體意義我老是記不住,當然不是說它的意思不懂,而只是容易搞混。現在記一下,以後就比較有印象了。在c 中,定義乙個int值的時候,它所占用的記憶體是4個位元組,然而這4個位元組裡面,我們如果得到這個int值的記憶體位址,其實就是它的最低位置的位址,如 int a 假設 a的記...