一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

打造自己的字節(jié)序轉(zhuǎn)換函數(shù)(16位、32位和64位)

 just_person 2014-12-09

在計(jì)算機(jī)科學(xué)領(lǐng)域中,字節(jié)序是指存放多字節(jié)數(shù)據(jù)的字節(jié)(byte)的順序,典型的情況是整數(shù)在內(nèi)存中的存放方式和網(wǎng)絡(luò)傳輸?shù)膫鬏旐樞?。不同的處理器所采用的字?jié)序可能是不同的,例如: x86,6502Z80VAX,和 PDP-11都是采用小端字節(jié)序,而 Motorola 6800 、 68kIBM POWER, 和 System/360則采用大端字節(jié)序。另外,網(wǎng)絡(luò)協(xié)議通常也會規(guī)定其所采用的字節(jié)序,還有像java這樣的語言,也是規(guī)定了字節(jié)序的(tcp/ip和java都是采用大端字節(jié)序)。


通常,系統(tǒng)中會提供ntohs、htons、ntohl、htonl這4個(gè)函數(shù),已實(shí)現(xiàn)16位和32位本地字節(jié)序和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換。但是,目前好像還沒有提供64位數(shù)據(jù)字節(jié)序的轉(zhuǎn)換函數(shù)。所以,在這里自己動手寫一個(gè)。


首先,我們要判斷本地系統(tǒng)所采用的字節(jié)序:

  1. #define BigEndian 1  
  2. #define LittleEndian 0  
  3. static bool BigEndianTest()  
  4. {  
  5.     /*定義一個(gè)2個(gè)字節(jié)長度的數(shù)據(jù),并賦值為1,則n的16進(jìn)制表示為0x0001 
  6.     如果系統(tǒng)以“大端”存放數(shù)據(jù),也即是以MSB方式存放,那么低字節(jié)存放的必定是0x00,高字節(jié)存放的必定是0x01 
  7.     如果系統(tǒng)以“小端”存放數(shù)據(jù),也即是以LSB方式存放,那么低字節(jié)存放的必定是0x01,高字節(jié)存放的必定是0x00 
  8.     所謂MSB,就是將最重要的位存入低位,而LSB則是將最不重要的位存入低位 
  9.     我們可以通過檢測低位的數(shù)值就可以知道系統(tǒng)的字節(jié)序 
  10.     */  
  11.     const __int16 n = 1;  
  12.     if(*(char *)&n)  
  13.     {  
  14.         return LittleEndian;  
  15.     }  
  16.     return BigEndian;  
  17. }  
 

當(dāng)然這里可以再優(yōu)化一下,寫成宏定義。

 

然后,定義16、32、64位的調(diào)位函數(shù)。這里就是字節(jié)“搬家”而已。

  1. #define Swap16(s) ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))  
  2. #define Swap32(l) (((l) >> 24) | /  
  3.            (((l) & 0x00ff0000) >> 8)  | /  
  4.            (((l) & 0x0000ff00) << 8)  | /  
  5.            ((l) << 24))  
  6. #define Swap64(ll) (((ll) >> 56) |/  
  7.                     (((ll) & 0x00ff000000000000) >> 40) |/  
  8.                     (((ll) & 0x0000ff0000000000) >> 24) |/  
  9.                     (((ll) & 0x000000ff00000000) >> 8)    |/  
  10.                     (((ll) & 0x00000000ff000000) << 8)    |/  
  11.                     (((ll) & 0x0000000000ff0000) << 24) |/  
  12.                     (((ll) & 0x000000000000ff00) << 40) |/  
  13.                     (((ll) << 56)))  
 

最后,

  1. #define BigEndian_16(s) BigEndianTest() ? s : Swap16(s)  
  2. #define LittleEndian_16(s) BigEndianTest() ? Swap16(s) : s  
  3. #define BigEndian_32(l) BigEndianTest() ? l : Swap32(l)  
  4. #define LittleEndian_32(l) BigEndianTest() ? Swap32(l) : l  
  5. #define BigEndian_64(ll) BigEndianTest() ? ll : Swap64(ll)  
  6. #define LittleEndian_64(ll) BigEndianTest() ? Swap64(ll) : ll  
 

現(xiàn)在,我們來測試一下:

 

  1. int main()  
  2. {  
  3.     unsigned __int16 i16 = 0xabcd;  
  4.     unsigned __int32 i32 = 0x0a0b0c0d;  
  5.     unsigned __int64 i64 = 0x0102030405060708;  
  6.     printf("System is %s/n",BigEndianTest() ? "BigEndian" : "LittleEndian" );  
  7.     printf("__int16 i16 = 0x%x, BigEndian:0x%x htons:0x%x, LittleEndian:0x%x ntohs:0x%x/n",  
  8.                     i16,BigEndian_16(i16),htons(i16),LittleEndian_16(i16),ntohs(BigEndian_16(i16)));  
  9.     printf("__int32 i32 = 0x%x, BigEndian:0x%x htons:0x%x, LittleEndian:0x%x ntohs:0x%x/n",  
  10.                     i32,BigEndian_32(i32),htonl(i32),LittleEndian_32(i32),ntohl(BigEndian_32(i32)));  
  11.     printf("__int64 i64 = 0x%llx, BigEndian:0x%llx, LittleEndian:0x%llx/n",i64,  
  12.                     BigEndian_64(i64),LittleEndian_64(i64));  
  13.     getchar();  
  14.     return 0;  
  15. }  
 

運(yùn)行結(jié)果如下:

 

  1. System is LittleEndian  
  2. __int16 i16 = 0xabcd, BigEndian:0xcdab htons:0xcdab, LittleEndian:0xabcd ntohs:0  
  3. xabcd  
  4. __int32 i32 = 0xa0b0c0d, BigEndian:0xd0c0b0a htons:0xd0c0b0a, LittleEndian:0xa0b  
  5. 0c0d ntohs:0xa0b0c0d  
  6. __int64 i64 = 0x102030405060708, BigEndian:0x807060504030201, LittleEndian:0x102  
  7. 030405060708  
 

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲欧美视频欧美视频| 欧美中文日韩一区久久| 91福利免费一区二区三区| 午夜精品一区二区av| 免费在线成人激情视频| 日本黄色高清视频久久| 国产在线日韩精品欧美| 欧美特色特黄一级大黄片| 中文字幕亚洲精品人妻| 欧美欧美欧美欧美一区| 国产日韩综合一区在线观看| 国产日韩欧美综合视频| 亚洲欧美黑人一区二区| 五月婷婷六月丁香在线观看| 国产亚洲视频香蕉一区| 国产精品香蕉免费手机视频| 国产一区二区三中文字幕| 欧美日韩精品一区二区三区不卡| 亚洲中文在线男人的天堂| 亚洲伦理中文字幕在线观看| 青青免费操手机在线视频| 欧美日韩综合在线第一页| 久久精视频免费视频观看| 国产精品免费视频专区| 久久精品国产亚洲熟女| 国产精品十八禁亚洲黄污免费观看| 国产欧美日韩精品一区二区| 亚洲熟女乱色一区二区三区| 国产传媒免费观看视频| 肥白女人日韩中文视频| 色婷婷国产熟妇人妻露脸| 日韩精品视频香蕉视频| 亚洲一区二区三区日韩91| 在线观看中文字幕91| 精品欧美国产一二三区| 五月综合婷婷在线伊人| 午夜小视频成人免费看| 精品欧美一区二区三久久| 国产一区二区三区丝袜不卡| 精品人妻久久一品二品三品| 成人免费高清在线一区二区|