乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      處理器字節(jié)大小端存儲(chǔ)方式、網(wǎng)絡(luò)字節(jié)順序(總結(jié))

       立志德美 2019-07-17

      1、大小端存儲(chǔ)方式

             為什么會(huì)有大小端模式之分呢?這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為 8bit。但是在C語(yǔ)言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對(duì)于位數(shù)大于 8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如何將多個(gè)字節(jié)安排的問(wèn)題。因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式。

              大端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這樣的存儲(chǔ)模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加,而數(shù)據(jù)從高位往低位放;這和我們的閱讀習(xí)慣一致。

      小端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲(chǔ)模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來(lái),高地址部分權(quán)值高,低地址部分權(quán)值低。例如一個(gè)16bit的short型x,在內(nèi)存中的地址為0x0010,x的值為0x1122,那么0x11為高字節(jié),0x22為低字節(jié)。對(duì)于 大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。對(duì)于32bit的int型,如下:

      0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
      0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
      在大端模式下,前32位應(yīng)該這樣讀: e6 84 6c 4e ,在小端模式下,前32位應(yīng)該這樣讀: 4e 6c 84 e6
      我們常用的X86結(jié)構(gòu)是小端模式,而KEIL C51則為大端模式。VC6.0編譯程序如下:
      1. int i = 0x1234;
      2. printf("&i address is %p\n", &i);
      3. printf("&i+1 address is %p\n", &i+1);
      4. printf("&i address data is %p\n\n",*(&i));
      5. printf("(char*)&i address is %p\n", (char*)&i);
      6. printf("(char*)&i+1 address is %p\n", (char*)&i+1);
      7. printf("(char*)&i address data is %p\n", *(char*)&i);
      8. printf("(char*)&i+1 address data is %p\n", *((char*)&i+1));
      結(jié)果如下:
      &i address  is 0012FF7C
      &i+1 address  is 0012FF80
      &i address data is 00001234


      (char*)&i address is 0012FF7C
      (char*)&i+1 address is 0012FF7D
      (char*)&i address data is 00000034
      (char*)&i+1 address data is 00000012
      2、網(wǎng)絡(luò)字節(jié)順序
      我們知道網(wǎng)絡(luò)上的數(shù)據(jù)流是字節(jié)流,對(duì)于一個(gè)多字節(jié)數(shù)值,在進(jìn)行網(wǎng)絡(luò)傳輸?shù)臅r(shí)候,先傳遞哪個(gè)字節(jié)?也就是說(shuō),當(dāng)接收端收到第一個(gè)字節(jié)的時(shí)候,它是將這個(gè)字節(jié)作為高位還是低位來(lái)處理呢?網(wǎng)絡(luò)字節(jié)序定義:收到的第一個(gè)字節(jié)被當(dāng)作高位看待,這就要求發(fā)送端發(fā)送的第一個(gè)字節(jié)應(yīng)當(dāng)是高位。而在發(fā)送端發(fā)送數(shù)據(jù)時(shí),發(fā)送的第一個(gè)字節(jié)是該數(shù)字在內(nèi)存中起始地址對(duì)應(yīng)的字節(jié)??梢?jiàn)多字節(jié)數(shù)值在發(fā)送前,在內(nèi)存中數(shù)值應(yīng)該以大端法存放。比如我們經(jīng)過(guò)網(wǎng)絡(luò)發(fā)送32bit整型數(shù)據(jù)0x12345678,在cortex-M3平臺(tái)中,它是以小端法存放的,在發(fā)送前需要使用系統(tǒng)提供的htonl將其轉(zhuǎn)換成大端法存放。
      lwip中字節(jié)轉(zhuǎn)換函數(shù):
      uint32_t htonl(uint32_t hostlong);//32位的主機(jī)字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序
      	uint16_t htons(uint16_t hostshort);//16位的主機(jī)字節(jié)序轉(zhuǎn)換到網(wǎng)絡(luò)字節(jié)序
      	uint32_t ntohl(uint32_t netlong);//32位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機(jī)字節(jié)序
      	uint16_t ntohs(uint16_t netshort);//16位的網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換到主機(jī)字節(jié)序

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多