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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两种大小端判断的方式

發布時間:2023/12/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两种大小端判断的方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網絡通信是按照字節流進行數據交換的,主機根據不同的CPU型號可能是大段存儲,也可能是小端存儲。而網絡字節序在TCP/IP協議中已經規定好了,采用大端的排序方式。
所以網絡通信中一般將需要傳輸的整數型值轉換成網絡字節序。
從本機字節序轉換成網絡字節序:host to net short/long

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

從網絡字節序轉換成本機字節序

#include <arpa/inet.h> uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netlshort);

轉換的原理其實也很簡單,就是判斷一下本地是大端還是小端,是大端就轉換一下序列,否則啥都不干。
下面介紹兩種用來判斷大小端的方法:

第一種,使用union

大端是指低字節存儲在高地址;小端存儲是指低字節存儲在低地址。我們可以根據聯合體來判斷該系統是大端還是小端。因為聯合體變量總是從低地址存儲。

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指針

隨意找一個2字節的十六進制數值,如0x1234
如果本地是小端編碼,那么12存在高地址,34存在低地址。那么強行把0x1234轉換成1字節的char時,高字節會被丟棄,留下低字節值34。
如果本地是大端編碼,那么高地址字節種存儲的是34,12存在低地址,強制轉換成1字節的char時,高字節會被丟棄,留下低字節值12。

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

實現htons函數

uint16_t htons(uint16_t hostshort) {if (isNetByteOrder())return hostshort;else return ((uint16_t)(hostshort >> 8)) | ((uint16_t)((hostshort & 0x00ff) << 8)); }

總結

以上是生活随笔為你收集整理的两种大小端判断的方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。