一、資料儲存順序:大端和小端
大端模式: 位址的增長順序與值的增長順序相反
小段模式: 位址的增長順序與值的增長順序相同
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。
我們常用的x86結構是小端模式,而keil c51則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。所以,主機位元組順序是小端模式。網路位元組順序是大端模式。
在c語言中,不同於結構體,共用體(聯合體)中的幾種不同型別的變數存放在同一段記憶體單元中。利用這一特點,可以用聯合體變數判斷arm或x86環境下,儲存系統是是大端還是小端模式。
#include "stdio.h"
int main()
c;c.a=1;
if (c.b==1)
printf("it is little_endian!\n");
else
printf("it is big_endian!\n");
return 1;
}
說明:
1 若是小端模式,由低位址到高位址c.a存放為0x01 00 00 00,c.b被賦值為0x01;
————————————————————————————
位址 0x00000000 0x00000001 0x00000002 0x00000003
c.a 01 00 00 00
c.b 01
————————————————————————————
2 若是大端模式,由低位址到高位址c.a存放為0x00 00 00 01,c.b被賦值為0x0;
————————————————————————————
位址 0x00000000 0x00000001 0x00000002 0x00000003
c.a 00 00 00 01
c.b 00
————————————————————————————
位元組序的處理
因為存在大端小端的問題,所以就要進行統一的轉換。
注意字串是不用轉換的,因為乙個字元正好佔一位元組。儲存順序不影響值。而浮點數也不用轉換,因為浮點數的讀取規則是在cpu中定義的,是一致的。
轉換所用的函式為:
htons(),htonl(); 主機轉為網路位元組序,s為short , l為long
ntohs(),ntohl(); 網路轉為主機位元組序。
二、位址格式的轉換
通常情況下,都是用點分十進位制(如:202.134.23.145)來表示ip位址。是個字串。但是程式中處理時用到的是乙個二進位制的值。所以要進行轉換。
具體的有四個函式:
#include#include#includeint main()
執行結果:
[localhost 400]$ ./addr
inet_addr:0xb2d26ca
inet_network:0xca262d0b
inet_ntoa:202.30.45.11
inet_aton:0xb2d26ca
[localhost 400]$
linux網路程式設計基礎(一)
一 資料儲存順序 大端和小端 高位位元組儲存高位元組稱為小端模式,通常都計算機採用這個模式儲存。而網路則採用大端傳輸。所以需要轉換 面試有時會出這麼個題 寫乙個程式判斷程式的儲存是大端還是小端?程式的原理見下圖 include includeunion wordc int check int mai...
Linux網路程式設計基礎 一
1 怎樣完成網路程式設計 伺服器 提供資料的為伺服器 客戶端 獲取資料的為客戶端 2 協議的選擇 tcp 面向連線,可靠的流式服務 udp 無連線的,不可靠的,資料報服務 3 tcp的程式設計流程 sever 伺服器端 建立socket include include int socket int ...
linux網路程式設計基礎 網路基礎
客戶機 client 伺服器 server 模式。需要在通訊兩端各自部署客戶機和伺服器來完成資料通訊。瀏覽器 browser 伺服器 server 模式。只需在一端部署伺服器,而另外一端使用每台pc都預設配置的瀏覽器即可完成資料的傳輸。c s模式 優點缺點 資料快取本地,效率高 工作量大,開發周期更...