1. 程式人生 > >htonl,htons,ntohl,ntohs的詳解

htonl,htons,ntohl,ntohs的詳解

大小端模式

對於多位元組的數值在系統中如何儲存取決於各CPU的實現,而高位元組部分是存在低地址還是高地址就有不一樣的結果了,因此才有大小端兩種模式的存在,而命名則是根據起始地址存放的是數值位元組的低處還是高處,如果是低處就是小端,高處就是大端,可以用程式碼來看看系統是如何儲存的,從而確定目前的環境是小端還是大端

#include <stdio.h>
#include <arpa/inet.h>   /*在Linux上*/

void main() {
     printf("%d\n", ntohl(1));
     int num = 0x12345678;

     int
i; for (i = 0; i < 4; ++i) { printf("%d:0x%x\n", i, *((char *)&num + i)); } printf("%x\n", num); num = htonl(num); for (i = 0; i < 4; ++i) { printf("%d:0x%x\n", i, *((char *)&num + i)); } printf("%x\n", num); }

網路位元組序

由於不同的系統會有不同的模式,為了統一,規定在網路傳輸中使用大端模式,這就是網路位元組序。現在看看下面這四個函式的作用

uint32_t htonl(uint32_t hostlong);//32位的主機位元組序轉換到網路位元組序
uint16_t htons(uint16_t hostshort);//16位的主機位元組序轉換到網路位元組序
uint32_t ntohl(uint32_t netlong);//32位的網路位元組序轉換到主機位元組序
uint16_t ntohs(uint16_t netshort);//16位的網路位元組序轉換到主機位元組序

拿htonl和ntohl來分析,htonl函式的內部實現原理是這樣,先判斷主機是什麼模式儲存,如果是大端模式,就跟網路位元組序一致,直接返回引數即可,如果是小端模式,則把形參轉換成大端模式儲存在一個臨時引數內,再把臨時引數返回;而ntohl函式的實現原理也是一樣的過程,但是要注意它的引數,引數是網路位元組序,就是大端模式儲存,而不管你傳入實參的過程是如果儲存的,因此當判斷主機是大端模式的時候,會直接返回,因為該函式預設會認為形參是網路位元組序,把它當大端模式來看,如果判斷主機是小端模式,就會將實參做轉換,轉換的過程並不複雜,就是逆序儲存各個位元組的資料,所以結果就被轉換。

說到這裡,可以看出一個規律來,就是如果主機與網路位元組序不一致(也就是小端模式),這四個函式的返回值與傳遞進去的實參值的位元組排序肯定是逆序的,所以返回值絕對不等於實參值,例如htonl(1)的結果肯定不是1,而如果主機與網路位元組序一致(也就是大端模式),則這四個函式根本就沒有做轉換操作,而是直接返回實參值,這樣他們的返回結果就肯定與實參值相同,即htonl(1)的結果是1。

這樣,我們就得到了一個非常簡便的判斷系統是什麼模式的方法,就是直接利用這四個函式來判斷,如

if (1 != htonl(1)) {
    //小端模式,作相應處理
} else {
    //大端模式,作相應處理
}

或者直接用一個判斷if(1 != htonl(1)),只有主機位元組序與網路位元組序不一致時,才呼叫那些函式去轉換,否則不需要處理,這樣可以減少多餘的函式呼叫。

相關推薦

htonl,htons,ntohl,ntohs

大小端模式 對於多位元組的數值在系統中如何儲存取決於各CPU的實現,而高位元組部分是存在低地址還是高地址就有不一樣的結果了,因此才有大小端兩種模式的存在,而命名則是根據起始地址存放的是數值位元組的低處還是高處,如果是低處就是小端,高處就是大端,可以用程式碼來看

ntohs, ntohl, htons,htonl的比較和

假設在x86平臺上,有一個int型變數,在記憶體中的內部由低到高分別是:0x12,0x34,0x56,0x78當通過網路傳送該資料時,正確的傳送順序是 0x78,0x56,0x34,0x12 X86 系列 CPU都是 little-endian 的,所以int 型變

socket程式設計為什麼需要htons(), ntohl(), ntohs(),htons() 函式

在C/C++寫網路程式的時候,往往會遇到位元組的網路順序和主機順序的問題。這是就可能用到htons(), ntohl(), ntohs(),htons()這4個函式。 網路位元組順序與本地位元組順序之間的轉換函式: htonl()--"Host to Networ

C++ htons(), htonl(), ntohs(), ntohl()

將多位元組整數型別的資料,從主機的位元組順序轉化為網路位元組順序 #include <netinet/in.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort);

socket編程為什麽需要htonl(), ntohl(), ntohs(),htons() 函數-------轉載

一個 包含 16進制 x86 ref 移植 erp 兩種 div 在C/C++寫網絡程序的時候,往往會遇到字節的網絡順序和主機順序的問題。這是就可能用到htons(), ntohl(), ntohs(),htons()這4個函數。 網絡字節順序與本地字節順序之間的轉換函數:

主機位元組序與網路位元組序的轉換函式:htonlntohlhtonsntohs

Part 1: htons函式具體解釋      在Linux和Windows網路程式設計時需要用到htons和htonl函式,用來將主機位元組順序轉換為網路位元組順序。      在Intel機器下,執行以下程式 int main() ...{    printf(

使用巨集模擬htonlntohlhtonsntohs的實現

typedef unsigned short int uint16;typedef unsigned long int uint32;// 短整型大小端互換#define BigLittleSwap16(A)        ((((uint16)(A) & 0xff0

模擬htonlntohlhtonsntohs函式實現

From: http://wxxweb.blog.163.com | Author: wxxweb | E-Mail: [email protected] 本文可任意轉載,但請註明原文出處 今天在如鵬網裡討論htonl、ntohl在不同機器的區別,特意模擬了htonl、ntohl、htons、n

htonl()函數

理解 問題 自定義 大端 編譯器 正常 lin 代碼 ret 在《Linux網絡編程》這本書中提到htonl()函數的原型。實現代碼如下: long htonl(long value) {   return ((value <<24 )|((value<&

htons函式

Part 1: htons函式具體解釋      在Linux和Windows網路程式設計時需要用到htons和htonl函式,用來將主機位元組順序轉換為網路位元組順序。      在Intel機器下,執行以下程式 int main() ...{    printf

java Io 流類

修改 文件目錄 != exe [] 深入 clas one fileinput 關於java 流類的復習;習慣性的復習按照圖結構一層層往下深入去了解去復習,最後通過代碼來實現感覺印象會更深刻一些; 關於 I/O流:IO可以理解為JAVA用來傳遞數據的管道

cookie 和session 的區別

重復 處理方式 一行 所有 有效 依據 是把 存儲 一個 二者的定義: 當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇, 都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的

cd命令使用

表示 如果 用戶家目錄 roo 環境變量 方法 字符 實用 效果   cd命令是目錄切換命令,是shell內置命令。   語法:     cd [-L|-P] [dir]   選項:     -p 如果要切換到的目標目錄是一個符號連接,直接切換到符號連接指向的目標目錄   

setting.xml 配置

校驗 找不到 順序 裁剪 全局 -- mls leg 觸發 文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用戶配置: ${user.home}/.m2/settings.xml note:用戶配置優先於全局配置。${user.home}

R數據可視化----ggplot2之標度、坐標軸和圖例

abs 調整 所有 不同的 size n) 默認 表達 idt 標度控制著數據到圖形屬性的映射,當有需要時,ggplot2會自動添加一個默認的標度。我們確實可以在不了解標度運行原理的情況下畫出許多圖形,但理解標度並學會如何操縱它們則將賦予我們對圖形更強的控制能力。 每一種圖

跨域資源共享CORS

附加 accep 不發送 地址 code 克服 通信 數據 ror 簡介 CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。 它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了AJAX

磁盤陣列 RAID 技術原理

十分 單獨 很好 不同的 raid1 miss 和數 會同 帶寬 RAID一頁通整理所有RAID技術、原理並配合相應RAID圖解,給所有存儲新人提供一個迅速學習、理解RAID技術的網上資源庫,本文將持續更新,歡迎大家補充及投稿。中國存儲網一如既往為廣大存儲界朋友提供免費、精

Web.Config文件

htm 用法 名稱 href 會話狀態 行為 cookie 程序配置 會話 一).Web.Config是以XML文件規範存儲,配置文件分為以下格式 1.配置節處理程序聲明 特點: 位於配置文件的頂部,包含在<configSections>標誌中。

oracle recyclebin

tables 執行 reat 手工 emp 命令 沒有 -- 釋放 今天在SOA應用數據庫上運用DBMS_REDEFITION包進行在線非分區表轉換分區表操作時,本想DROP掉建的臨時表cube_scope_temp不小心後面忘記加"temp"直接執行了,我等意識到這個問題

POI操作Excel,讀取xls和xlsx格式的文件

shee xss split 類型 後綴 .sh lan xls lin package org.ian.webutil; import java.io.File; import java.io.FileInputStream; import java.io.FileN