關於位元組序的問題,查了一些資料:
1.大小端
2.網路位元組序
3.大小端與網路位元組序
4.socket與位元組序
上述資料裡有相關概念和知識點的說明,以下會對部分問題做幾點總結。
這裡以主機位元組序作說明,計算機在儲存多位元組資料時,例如c語言中的整型資料(int),無法用乙個位元組單元的記憶體將資料完成儲存,因此就需要使用多個位元組單元的記憶體來儲存這種資料,帶來的問題是,資料的高低位元組部分怎樣對應記憶體中的高低位址進行儲存呢?所以就產生了大小端資料儲存模式,到底是何種模式是跟cpu架構有關係的。如何區分記憶大端序、小端序呢?我是這麼理解的:cpu在讀取記憶體資料時,習慣是從低位址開始定址,如果讀到的是資料的高位元組部分則是大端序,否則為小端序。
網路位元組序:在網路傳輸過程中的結構,一般而言指的是大端位元組序。這是我們規定的多位元組資料在網路傳輸中傳輸方式,作為網路資料的接收方,規定收到的第乙個位元組為資料的高位元組部分並將其儲存在低位址中(大端模式)。
當進行資料的跨平台(跨cpu架構)網路傳輸時,需要考慮大小端序的轉換問題:
1.當各平台的主機位元組序一致時,無需進行轉換;
2.當各平台的主機位元組序不一致時,需要進行轉換,否則將會導致資料錯亂;
3.關於位元組序轉換函式,不同作業系統下有自己的api函式,以下以linux為例簡單列舉下:
#include
uint32_t htonl
(uint32_t hostlong)
;uint16_t htons
(uint16_t hostshort)
;uint32_t ntohl
(uint32_t netlong)
;uint16_t ntohs
(uint16_t netshort)
;
這些函式名很好記,h表示host,n表示network,l表示32位長整數,s表示16位短整數。例如htonl表示將32位的長整數從主機位元組序轉換為網路位元組序,例如將ip位址轉換後準備傳送。如果主機是小端位元組序,這些函式將引數做相應的大小端轉換然後返回,如果主機是大端位元組序,這些函式不做轉換,將引數原封不動地返回。 TCP IP網路程式設計之位元組序和網路位元組序
一 概要 二 簡介 在此之前我們需要了解清楚幾個概念。cpu架構 人們常說的x86 x64是一種架構,但是他有32位的和64位的。32位的叫x86 後來出現基於它的64位版,就叫x64。作業系統位數 64位的系統是基於64位處理器而來的,所以64位的系統能在64位的處理器上執行,但是不能在32的處理...
socket程式設計之網路位元組序與主機位元組序
0 為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型,另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於...
網路程式設計2 網路程式設計之位元組序
1.什麼是位元組序 位元組序是指多位元組資料在計算機記憶體中儲存或者網路傳輸時各位元組的儲存順序。2.常見的位元組序 a little endian 將低序位元組儲存在起始位址 小端位元組序 b big endian 將高序位元組儲存在起始位址 大端位元組序 例子1 在記憶體中雙字0x0102030...