【C語言】網絡字節序和主機字節序

網絡字節序和主機字節序是計算機中字節的兩種排序方式,它們主要用于解決不同計算機之間數據通信的問題。

一、網絡字節序

? ? ? ? 也被稱為大端字節序,是一種標準的字節序。在網絡通信中,如果兩臺主機的字節序不同,可能會導致數據解釋的二義性。為了避免這種問題,網絡字節序被采用。無論主機使用什么字節序,發送到網絡中的數據都是網絡字節序,接收方可以根據自己的主機字節序進行轉換。這樣,無論接收方使用什么字節序,都能正確地解釋數據。

二、主機字節序

? ? ? ? 常為小端字節序,是每臺計算機根據其硬件設計所采用的字節序。不同的計算機主機字節序可能不相同,與CPU設計有關。這導致了在存儲單元超過一個字節的數據時,需要使用網絡字節序進行通信,以避免兼容性問題。

三、網絡字節序和主機字節序的示例

? ? ? 假設我們有一個32位的整數0x12345678。

  1. 在主機字節序中,這個整數的存儲方式取決于主機的字節序規則。在大端(Big-Endian)系統中,高位字節存儲在低地址處,低位字節存儲在高地址處。因此,0x12345678在大端系統中的存儲順序是0x12 0x34 0x56 0x78。而在小端(Little-Endian)系統中,低位字節存儲在低地址處,高位字節存儲在高地址處。所以,0x12345678在小端系統中的存儲順序是0x78 0x56 0x34 0x12。
  2. 在網絡字節序中,采用的是大端(Big-Endian)字節序。因此,無論主機使用的是什么字節序規則,發送到網絡上的數據都必須轉換成網絡字節序。在這個例子中,我們要發送的整數0x12345678在網絡字節序中的表示就是0x12 0x34 0x56 0x78。

? ? ? ? 在實際編程中,我們通常會使用一些函數如htons, htonl, htonll,ntohs, ntohl,ntohll等來進行主機字節序和網絡字節序之間的轉換。

四、編程示例

? ? ? ?下面是一個使用C語言編寫的示例,演示了如何在網絡字節序和主機字節序之間進行轉換。

#include <stdio.h>  
#include <arpa/inet.h>  
#include <netinet/in.h>  int main() {  uint32_t host_int = 0x12345678; // 假設主機字節序為Little-Endian  uint32_t net_int;  uint32_t converted_host_int;  // 將主機字節序轉換為網絡字節序  net_int = htonl(host_int);  printf("Host byte order: 0x%X\n", host_int);  printf("Network byte order: 0x%X\n", net_int);  // 將網絡字節序轉換回主機字節序  converted_host_int = ntohl(net_int);  printf("Converted back to host byte order: 0x%X\n", converted_host_int);  return 0;  
}

? ? ? ? 上面的示例中,我們使用了兩個函數:htonlntohlhtonl函數用于將32位主機字節序整數轉換為網絡字節序,而ntohl函數則執行相反的操作。這兩個函數都在頭文件<arpa/inet.h>中定義。對于16位整數,可以使用htonsntohs函數。64位整數,可以使用htonll和ntohll函數。這些函數在處理IP地址和端口號時非常有用,因為IP地址和端口號在網絡傳輸時需要使用網絡字節序。

? ? ? ? 編程示例中,主機字節序轉換為網絡字節序函數相當于:

void int2bytes( unsigned int v, unsigned char *str )
{str[0] = (v>>24)&0xFF;str[1] = (v>>16)&0xFF;str[2] = (v>>8)&0xFF;str[3] = (v)&0xFF;
}

? ? ? ? 網絡字節序轉換為主機字節序函數相當于:

unsigned int bytes2int(unsigned char *str)
{unsigned int data;data = ((*str) << 24) | ((*(str+1))<<16) | ( (*(str+2))<<8 ) | (*(str+3));return data;
}

? ? ? ?請注意,示例中的主機字節序假設為小端字節序(Little-Endian)。如果主機實際上使用大端字節序(Big-Endian),則網絡字節序和主機字節序將是相同的,因此這些轉換函數在這種情況下不會執行任何操作。

五、總結

? ? ? ? 網絡字節序和主機字節序的主要區別在于使用場景:網絡字節序主要用于網絡通信中保證數據的正確性,而主機字節序則是每臺計算機根據其硬件設計所采用的字節序。

? ? ? ? 在跨平臺通信中,為了確保數據的一致性,通常會使用網絡字節序來進行數據的傳輸和存儲。然而,在某些情況下,為了更好地利用硬件的性能,可能會選擇使用主機字節序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209842.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209842.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209842.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Swagger提示請確保swagger資源接口正確

問題描述 在項目開發過程中集成swagger-bootstrap-ui&#xff0c;打開swagger-ui.html頁面正常&#xff0c;但是打開doc.html頁面提示"請確保swagger資源接口正確"。 原因分析&#xff1a; 原因是JSON格式非法&#xff0c;一般出現此情況時&#xff0c;是因為后端…

shell條件測試

1.1.用途 為了能夠正確處理Shell程序運行過程中遇到的各種情況&#xff0c;Linux Shell提供了一組測試運算符. 通過這些運算符&#xff0c;shell程序能夠判斷某種或者幾個條件是否成立。 條件測試在各種流程控制語句&#xff0c;例如判斷語句和循環語句中發揮了…

數據分析實例:基于電力大數據的中小型企業運營發展分析

前不久&#xff0c;帆軟發起了【2023BI數據分析大賽】的活動&#xff0c;老李我也是這個大賽的評委。 ? 今天跟大家分享的是基于電力大數據的中小型企業運營發展分析。 當我們去解讀一份數據分析報告時&#xff0c;首先要了解這份報告的主要目的是什么&#xff0c;作者通過分…

第19關 5.2k star 開源分布式存儲服務Rancher-Longhorn在k8s上部署

------> 課程視頻同步分享在今日頭條和B站 大家好&#xff0c;我是博哥愛運維。 什么是Longhorn Longhorn是一個輕量級、可靠且易于使用的Kubernetes分布式塊存儲系統。 Longhorn 是免費的開源軟件。它最初由 Rancher Labs 開發&#xff0c;現在作為云原生計算基金會的孵…

X86匯編語言:從實模式到保護模式(代碼+注釋)--c7

X86匯編語言&#xff1a;從實模式到保護模式&#xff08;代碼注釋&#xff09;–c6 ;代碼清單7-1;文件名&#xff1a;c07_mbr.asm;文件說明&#xff1a;硬盤主引導扇區代碼;創建日期&#xff1a;2011-4-13 18:02jmp near startmessage db 123...100start:mov ax,0x7c0 …

class061 最小生成樹【算法】

class061 最小生成樹【算法】 2023-12-8 11:48:12 算法講解061【必備】最小生成樹 code1 P3366 【模板】最小生成樹 // Kruskal算法模版&#xff08;洛谷&#xff09; // 靜態空間實現 // 測試鏈接 : https://www.luogu.com.cn/problem/P3366 // 請同學們務必參考如下代碼中…

【Linux】:線程(二)互斥

互斥與同步 一.線程的局部存儲二.線程的分離三.互斥1.一些概念2.上鎖3.鎖的原理4.死鎖 一.線程的局部存儲 例子 可以看到全局變量是所有線程共享的&#xff0c;如果我們想要每個線程都單獨訪問g_val怎么辦呢&#xff1f;其實我們可以在它前面加上__thread修飾。 這就相當于把g…

網絡入門---網絡編程初步認識和實踐(使用udp協議)

目錄標題 前言準備工作udpserver.hpp成員變量構造函數初始化函數(socket,bind)start函數(recvfrom) udpServer.ccudpClient.hpp構造函數初始化函數run函數(sendto) udpClient.cc測試 前言 在上一篇文章中我們初步的認識了端口號的作用&#xff0c;ip地址和MAC地址在網絡通信時…

Python實現GUI圖片瀏覽程序

Python實現GUI圖片瀏覽程序 下面程序需要pillow庫。pillow是 Python 的第三方圖像處理庫&#xff0c;需要安裝才能實用。pillow是PIL&#xff08; Python Imaging Library&#xff09;基礎上發展起來的&#xff0c;需要注意的是pillow庫安裝用pip install pillow&#xff0c;導…

【改進YOLOv8】融合可擴張殘差(DWR)注意力模塊的小麥病害檢測系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義&#xff1a; 隨著計算機視覺技術的快速發展&#xff0c;深度學習在圖像識別和目標檢測領域取得了巨大的突破。其中&#xff0c;YOLO&#xff08;You Only Look O…

基于SSM框架的網上商城系統的設計與實現

完整下載&#xff1a;基于SSM框架的網上商城系統的設計與實現 基于SSM框架的網上商城系統的設計與實現 "Design and Implementation of an Online Shopping Mall System Based on SSM Framework" 目錄 目錄 2 摘要 3 關鍵詞 3 第一章 系統設計 4 1.1 系統需求分析 4 …

TruLens RAG Triad 學習

TruLens RAG Triad 學習 0. 背景1. RAG 三元組2. TruLens 快速入門2-1. 安裝依賴2-2. 初始化 OpenAI 認證信息2-3. 獲取數據2-4. 創建向量存儲2-5. 從頭構建自定義 RAG2-6. 設置反饋函數2-7. 構建應用程序2-8. 運行應用程序0. 背景 近年來,RAG 架構已成為為大型語言模型 (LLM…

Nexus搭建npm私庫(角色管理、上傳腳本)

安裝Nexus 官網下載 https://www.sonatype.com/products/sonatype-nexus-oss-download 進入官網下載&#xff0c;最新下載方式需要輸入個人信息才能下載了 選擇對應的系統進行下載 Windows 推薦也下載 UNIX 版本&#xff08;Windows 版本配置比較難改&#xff09; 如果沒有下…

chmod 在Linux原生應用開發過程中的簡單應用

chmod命令實質上是用來修改文件或目錄的訪問權限的命令。它通過修改文件或目錄的訪問控制列表&#xff08;Access Control List&#xff0c;ACL&#xff09;來實現權限的更改。 在Linux系統中&#xff0c;每個文件或目錄都有一個表示其權限的數字值&#xff0c;即用三個八進制…

Qt 中的窗口類

目錄 QWidget 設置父對象 窗口位置 測試代碼 窗口尺寸 窗口標題和圖標 信號 槽函數 QDialog 常用API QDialog的子類 QMessageBox QFileDialog QFontDialog QFontDialog類的靜態API QColorDialog 顏色類 QColor 靜態API函數 測試代碼 QInputDialog 靜態函數…

谷歌AI新篇章:Gemini引領股價飆升,挑戰OpenAI霸主地位

導語&#xff1a; “ 在人工智能領域的一場激烈角逐中&#xff0c;谷歌母公司Alphabet以其全新AI大模型Gemini&#xff0c;于周四收盤時引爆股市&#xff0c;股價激增5.3%&#xff0c;市值一日增長超800億美元。這一躍升不僅展示了谷歌在技術創新上的決心&#xff0c;也是對微軟…

GPT4停止訂閱付費了怎么辦? 怎么升級ChatGPT plus?提供解決方案

11月中旬日OpenAI 暫時關閉所有的升級入口之后&#xff0c;很多小伙伴就真的在排隊等待哦。其實有方法可以繞開排隊&#xff0c;直接付費訂閱升級GPT的。趕緊用起來立馬“插隊”成功&#xff01;親測~~~ 一、登錄ChatGPT賬號 1、沒有賬號可以直接注冊一個&#xff0c;流程超級…

前端使用視頻作為背景圖的方法

實現思路 通過 video source 引入視頻&#xff0c;并對視頻播放屬性進行設置&#xff0c;再通過 css 使視頻覆蓋背景即可。 代碼 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>有開發問題可聯系作者</title>…

學習git后,真正在項目中如何使用?

文章目錄 前言下載和安裝Git克隆遠程倉庫PyCharm鏈接本地Git創建分支修改項目工程并提交到本地倉庫推送到遠程倉庫小結 前言 網上學習git的教程&#xff0c;甚至還有很多可視化很好的git教程&#xff0c;入門git也不是什么難事。但我發現&#xff0c;當我真的要從網上克隆一個…

ubuntu18.04安裝pcl1.11.1

一、安裝pcl1.11.1依賴 sudo apt-get update sudo apt-get install git build-essential linux-libc-dev sudo apt-get install cmake cmake-gui sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev sudo apt-get install mpi-default-dev openmpi-bin openmpi-…