最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例

 更新時(shí)間:2023年11月02日 11:37:11   作者:點(diǎn)墨  
這篇文章主要為大家介紹了C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

字節(jié)序問題

現(xiàn)代CPU一次至少能裝載4字節(jié)(32位機(jī)),即一個(gè)整數(shù),這4個(gè)字節(jié)在內(nèi)存中的排列順序?qū)⒂绊懰闹?。這就是字節(jié)序問題。字節(jié)序分為大端字節(jié)序(big endian)和小端字節(jié)序(little endian)。

如上圖,大端字節(jié)序是指數(shù)據(jù)的高位存在內(nèi)存的低地址處,小端字節(jié)序是指數(shù)據(jù)的高位存在內(nèi)存的高地址處。

現(xiàn)代PC大多采用小端字節(jié)序

當(dāng)格式化的數(shù)據(jù)需要在兩臺(tái)使用不同字節(jié)序的主機(jī)進(jìn)行傳遞時(shí),接收端會(huì)錯(cuò)誤的處理。解決的方法是:發(fā)送端將發(fā)送的數(shù)據(jù)轉(zhuǎn)換成大端字節(jié)序然后發(fā)送,接收端根據(jù)自己的字節(jié)序決定需不需要處理(小端轉(zhuǎn)換,大端不處理)。

在做網(wǎng)絡(luò)編程的時(shí)候,使用提供的庫即可進(jìn)行轉(zhuǎn)換(linux庫,windows下是一樣的,頭文件有所區(qū)別)

#include <netinet/in.h>
unsigned long int _htonl(unsigned long int hostlong);
unsigned short int _htons(unsigned short int hostshort);
unsigned long int _ntohl(unsigned long int netlong);
unsigned short int _ntohs(unsigned short int netshort);

互換數(shù)據(jù)

如果平臺(tái)沒有提供這套,那么可以自己實(shí)現(xiàn)一下,原理很簡單,就是互換下數(shù)據(jù)

#include <stdint.h>
#define BigLittleSwap16(v) ((0xFF00 & (uint16_t)(v)) >> 8 | (0x00FF & (uint16_t)(v)) << 8)
#define BigLittleSwap32(v) ((0xFF000000 & (uint32_t)(v)) >> 24 | (0x00FF0000 & (uint32_t)(v)) >> 8 | (0x0000FF00 & (uint32_t)(v)) << 8 | (0x000000FF & (uint32_t)(v)) << 24) 
#define BigLittleSwap64(v) ((0xFF00000000000000 & (uint64_t)(v)) >> 56 |(0x00FF000000000000 & (uint64_t)(v)) >> 40 |(0x0000FF0000000000 & (uint64_t)(v) )>> 24 |(0x000000FF00000000 & (uint64_t)(v)) >> 8 |(0x00000000FF000000 & (uint64_t)(v)) << 8| (0x0000000000FF0000 & (uint64_t)(v)) << 24 | (0x000000000000FF00 & (uint64_t)(v) )<< 40 | (0x00000000000000FF & (uint64_t)(v) )<< 56 )
int isCPUBigEndian(){
    union Data{
        short val;
        char byte;
    } data;
    data.val = 0x0102;
    return (data.byte == 0x01);
}
unsigned long int _htonl(unsigned long int hostlong);
unsigned short int _htons(unsigned short int hostshort);
unsigned long int _ntohl(unsigned long int netlong);
unsigned short int _ntohs(unsigned short int netshort);
unsigned long int _htonl(unsigned long int hostlong){
    return isCPUBigEndian() ? hostlong : BigLittleSwap32(hostlong);
}
unsigned short int _htons(unsigned short int hostshort){
    return isCPUBigEndian() ? hostshort : BigLittleSwap16(hostshort);
}
unsigned long int _ntohl(unsigned long int netlong){
    return isCPUBigEndian() ? netlong : BigLittleSwap32(netlong);
}
unsigned short int _ntohs(unsigned short int netshort){
    return isCPUBigEndian() ? netshort : BigLittleSwap16(netshort);
}

測試

#include <netinet/in.h>
#include <stdio.h>
int main(int argc,const char*argv[]){
   long int v1 = 0x11223344;
   short int v2 = 0x1122;
   printf("the endian of system is:%s\n",isCPUBigEndian()?"Big Endian":"Little Endian");
   printf("htonl:%x , %x , %x\n",v1,htonl(v1),_htonl(v1));
   printf("htons:%x , %x , %x\n",v2,htons(v2),_htons(v2));
   printf("ntohl:%x , %x , %x\n",v1,ntohl(v1),_ntohl(v1));
   printf("ntohs:%x , %x , %x\n",v2,htons(v2),_htons(v2));
    return 0;
}

在linux下的測試結(jié)果如下圖

以上就是C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例的詳細(xì)內(nèi)容,更多關(guān)于C++主機(jī)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++你可能不知道地方小結(jié)

    C++你可能不知道地方小結(jié)

    c++中編譯器替我們完成了許多事情,我們可能不知道,但也可能習(xí)以為常
    2013-01-01
  • C++ 調(diào)用 QML 回調(diào)方法的完整實(shí)現(xiàn)

    C++ 調(diào)用 QML 回調(diào)方法的完整實(shí)現(xiàn)

    在 Qt 6 開發(fā)中,C++ 與 QML 混合編程是常見場景,當(dāng) C++ 處理異步操作時(shí),需要將結(jié)果通知給 QML 界面,回調(diào)函數(shù)是最直觀的通信方式之一,下面小編就和大家詳細(xì)講講具體的調(diào)用實(shí)現(xiàn)方法吧
    2025-11-11
  • C++ std::condition_variable 條件變量用法解析

    C++ std::condition_variable 條件變量用法解析

    condition_variable(條件變量)是 C++11 中提供的一種多線程同步機(jī)制,它允許一個(gè)或多個(gè)線程等待另一個(gè)線程發(fā)出通知,以便能夠有效地進(jìn)行線程同步,這篇文章主要介紹了C++ std::condition_variable 條件變量用法,需要的朋友可以參考下
    2023-09-09
  • C語言實(shí)現(xiàn)簡易停車場管理系統(tǒng)

    C語言實(shí)現(xiàn)簡易停車場管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易停車場管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言聯(lián)合體類型的實(shí)現(xiàn)

    C語言聯(lián)合體類型的實(shí)現(xiàn)

    聯(lián)合體也是一種構(gòu)造數(shù)據(jù)類型,和結(jié)構(gòu)體類型一樣,它也是由各種不同類型的數(shù)據(jù)組成,本文主要介紹了C語言聯(lián)合體類型的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C++中文件操作基礎(chǔ)詳解

    C++中文件操作基礎(chǔ)詳解

    這篇文章主要為大家詳細(xì)介紹了C++中的一些文件操作基礎(chǔ)詳解,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-06-06
  • C語言深入了解自定義數(shù)據(jù)類型的使用

    C語言深入了解自定義數(shù)據(jù)類型的使用

    這篇文章主要給大家介紹了關(guān)于C語言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C語言算術(shù)運(yùn)算符整理

    C語言算術(shù)運(yùn)算符整理

    算術(shù)運(yùn)算符用于各類數(shù)值運(yùn)算,包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運(yùn)算,%)、自增(++)、自減(--)共七種
    2023-03-03
  • C語言結(jié)構(gòu)體struct詳解

    C語言結(jié)構(gòu)體struct詳解

    C語言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • C++菱形繼承和虛繼承的實(shí)現(xiàn)

    C++菱形繼承和虛繼承的實(shí)現(xiàn)

    本文主要介紹了C++菱形繼承和虛繼承的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

麻阳| 视频| 华容县| 汉源县| 丰镇市| 寻乌县| 广安市| 疏附县| 琼结县| 略阳县| 南木林县| 海宁市| 阳朔县| 惠州市| 石泉县| 海城市| 阳高县| 伊宁县| 内丘县| 云龙县| 三台县| 弋阳县| 清苑县| 夹江县| 江山市| 永昌县| 当涂县| 波密县| 博兴县| 香港 | 昂仁县| 冷水江市| 于都县| 汉阴县| 将乐县| 南皮县| 新野县| 大荔县| 新竹县| 浦县| 河北省|