linux網路編程:位元組序(大端、小端、網路、主機)

来源:https://www.cnblogs.com/ghostwu/archive/2018/01/08/8241197.html
-Advertisement-
Play Games

位元組序:就是數據在記憶體中的存放順序,也可稱之為端模式。 大端模式和小端模式的定義 1) Little-Endian就是低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。 2) Big-Endian就是高位位元組排放在記憶體的低地址端,低位位元組排放在記憶體的高地址端。 3) 網路位元組序:TCP/I ...


位元組序:就是數據在記憶體中的存放順序,也可稱之為端模式。

大端模式和小端模式的定義

1) Little-Endian就是低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。

2) Big-Endian就是高位位元組排放在記憶體的低地址端,低位位元組排放在記憶體的高地址端。

3) 網路位元組序:TCP/IP各層協議將位元組序定義為Big-Endian,因此TCP/IP協議中使用的位元組序通常稱之為網路位元組序

什麼是高位位元組,低位位元組?

一般一個16位(雙位元組)的數據,比如 FF1A (16進位),(4位二進位用一個十六進位表示)
那麼高位位元組就是FF,低位是1A
如果是32位的數據,比如 3F68415B
高位字(不是位元組)是3F68
低位字是415B
右邊是低位,左邊是高位

include <stdio.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    unsigned int x = 0x12345678;
    unsigned char* p = (unsigned char*)&x;

    //小端位元組序
    printf( "%p->%0x\n%p->%0x\n%p->%0x\n%p->%0x\n", p+0, *(p+0), p+1, *(p+1), p+2, *(p+2), p+3, *(p+3) );

    printf( "---------------------\n" );

    //h:主機位元組序    n:網路位元組序  l:long
    unsigned int y = htonl( x );    
    p = ( unsigned char* )&y;

    printf( "%p->%0x\n%p->%0x\n%p->%0x\n%p->%0x\n", p+0, *(p+0), p+1, *(p+1), p+2, *(p+2), p+3, *(p+3) );

    return 0;
}

輸出結果:

0x7fff3bb55708->78
0x7fff3bb55709->56
0x7fff3bb5570a->34
0x7fff3bb5570b->12
---------------------
0x7fff3bb5570c->12
0x7fff3bb5570d->34
0x7fff3bb5570e->56
0x7fff3bb5570f->78

第一種結果:

0x7fff3bb55708->78
0x7fff3bb55709->56
0x7fff3bb5570a->34
0x7fff3bb5570b->12

地址從08--->0b屬於增長,   08這個低地址放的是78, 78這個數是低位位元組,  這種情況屬於低地址放低位位元組,高地址放高位位元組, 所以叫:小端位元組序

第二種結果:

0x7fff3bb5570c->12
0x7fff3bb5570d->34
0x7fff3bb5570e->56
0x7fff3bb5570f->78

把主機位元組序轉換成了網路位元組序, 這種情況屬於低地址放高位位元組,高地址放低位位元組,所以叫:大端位元組序

---------------------------------------------------------------------------------------------------------------------------------------------------------

位元組序轉換相關API:

htonl:主機位元組序轉換成網路位元組序

inet_addr:函數原型:in_addr_t inet_addr(const char *cp)

作用:把ip地址格式轉成網路位元組序

unsigned int addr = inet_addr( "192.168.1.100" );
printf( "%u\n", addr );
printf( "0x%0x\n", addr );

結果:

1677830336
0x6401a8c0

這兩個數是一樣的

ntohl: 網路位元組序轉主機位元組序

unsigned int haddr = ntohl( addr );
printf( "%u\n", haddr );
printf( "0x%0x\n", haddr );

inet_ntoa:網路位元組序,轉ip地址格式

struct in_addr ipaddr;
ipaddr.s_addr = addr;
printf( "%s\n", inet_ntoa( ipaddr ) );

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Note: ‘小白’我本人的挖坑總結,記錄一次悲催自作孽的安裝過程 > 安裝基本Follow:http://www.linuxidc.com/Linux/2016-06/132051.htm > 一些區別 及 “踩坑”記錄: a. 註意下麵提示文字,版本不同進入編輯的指令也不同,eg:2017.8版 ...
  • who命令的作用用於顯示當前有哪些用戶登錄到系統。 這個命令執行的原理是讀取了系統上utmp文件中記錄的所有登錄信息,直接顯示出來的 utmp文件在哪裡呢? man who的時候,在手冊下麵有這麼一段說明:意思就是不指定文件參數,那麼讀取的就是/var/run/utmp,到底是不是,驗證下 當我指定 ...
  • 這一系列的Linux入門都是本人在《鳥哥的Linux私房菜》的基礎上總結的基本內容,主要是記錄下自己的學習過程,也方便大家簡要的瞭解 Linux Distribution是Ubuntu而不是書本上推薦的CentOS,建議裝雙系統,不要使用虛擬機。 代碼在github上:Linuxpractice 其 ...
  • 實戰環境: 公司計劃在年底做一次大型市場促銷活動,全面衝刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同事儘快實現,當你接到這個任務時,有沒有更快的解決方式? ...
  • 1.GPG簡介 1991年,程式員Phil Zimmermann為了避開政府的監視,開發了加密軟體PGP。因為這個軟體非常好用,迅速流傳開來成為許多程式員的必備工具。但是,它是商業軟不能自由使用。所以,自由軟體基金會決定,開發一個PGP的替代品取名為GnuPG,因此GPG就誕生了。GPG是GNU P ...
  • 什麼是socket? socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。其實socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操 ...
  • macos 命令行安裝 ipa 蘋果發神經後itunes已經無法在安裝app了,如果有知道的兄弟可以告訴我啊 "ideviceinstaller" 使用這個開源項目可以在macos下安裝app 安裝後, 運行 出現 這個,可以看看這個 "issues" 我使用下麵這個方式成功解決 ...
  • 這一系列的Linux入門都是本人在《鳥哥的Linux私房菜》的基礎上總結的基本內容,主要是記錄下自己的學習過程,也方便大家簡要的瞭解 Linux Distribution是Ubuntu而不是書本上推薦的CentOS,建議裝雙系統,不要使用虛擬機。 代碼在github上:Linuxpractice 其 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...