日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

两种大小端判断的方式

發(fā)布時(shí)間:2023/12/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两种大小端判断的方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(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

#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort);

從網(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。

bool isNetByteOrder() {unsigned short mode = 0x1234;char* pmode = (char*) &mode;// 如果將低字節(jié)放在低位,則是小端字節(jié)序return (*pmode != 0x34); }

實(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。