两种大小端判断的方式
網(wǎng)絡(luò)通信是按照字節(jié)流進(jìn)行數(shù)據(jù)交換的,主機(jī)根據(jù)不同的CPU型號(hào)可能是大段存儲(chǔ),也可能是小端存儲(chǔ)。而網(wǎng)絡(luò)字節(jié)序在TCP/IP協(xié)議中已經(jīng)規(guī)定好了,采用大端的排序方式。
所以網(wǎng)絡(luò)通信中一般將需要傳輸?shù)恼麛?shù)型值轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序。
從本機(jī)字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序:host to net short/long
從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成本機(jī)字節(jié)序:
#include <arpa/inet.h> uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netlshort);轉(zhuǎn)換的原理其實(shí)也很簡(jiǎn)單,就是判斷一下本地是大端還是小端,是大端就轉(zhuǎn)換一下序列,否則啥都不干。
下面介紹兩種用來(lái)判斷大小端的方法:
第一種,使用union
大端是指低字節(jié)存儲(chǔ)在高地址;小端存儲(chǔ)是指低字節(jié)存儲(chǔ)在低地址。我們可以根據(jù)聯(lián)合體來(lái)判斷該系統(tǒng)是大端還是小端。因?yàn)槁?lián)合體變量總是從低地址存儲(chǔ)。
bool isNetByteOrder() {union test {int i;char c;};test t;t.i = 1;// 如果是大端,則 t.c 為0x00,則 t.c != 1 返回true// 否則返回falsereturn (t.c != 1); }第二種,使用char指針
隨意找一個(gè)2字節(jié)的十六進(jìn)制數(shù)值,如0x1234
如果本地是小端編碼,那么12存在高地址,34存在低地址。那么強(qiáng)行把0x1234轉(zhuǎn)換成1字節(jié)的char時(shí),高字節(jié)會(huì)被丟棄,留下低字節(jié)值34。
如果本地是大端編碼,那么高地址字節(jié)種存儲(chǔ)的是34,12存在低地址,強(qiáng)制轉(zhuǎn)換成1字節(jié)的char時(shí),高字節(jié)會(huì)被丟棄,留下低字節(jié)值12。
實(shí)現(xiàn)htons函數(shù)
uint16_t htons(uint16_t hostshort) {if (isNetByteOrder())return hostshort;else return ((uint16_t)(hostshort >> 8)) | ((uint16_t)((hostshort & 0x00ff) << 8)); }總結(jié)
以上是生活随笔為你收集整理的两种大小端判断的方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 幻塔花物语任务怎么完成
- 下一篇: 心跳检测以及应用层心跳包机制设计