一、概要
本篇文章主要講解基於.net中tcp/ip網絡通信編程中的網絡字節序。在自我進步的過程中記錄這些內容,方便自己記憶的同時也希望可以幫助到大家。技術的進步源自於分享和不斷的自我突破。
技術交流QQ群:580749909 歡迎交流有問必答,文章尾有個人的微信公眾號有興趣的小伙伴多多關注。
二、簡介
在此之前我們需要了解清楚幾個概念。
CPU架構:人們常說的x86 x64是一種架構,但是他有32位的和64位的。32位的叫x86 ,后來出現基於它的64位版,就叫x64。
操作系統位數 :64位的系統是基於64位處理器而來的,所以64位的系統能在64位的處理器上運行,但是不能在32的處理器上運行!
而因為64位處理器是基於32位的X86而來,所以向后兼容,支持32位的系統!
情況如下:
64位處理器(X64):64位系統,32位系統
32位處理器(X86):32位系統。64位處理器也能跑16位系統。
只不過進了長模式之后,不再兼容16位指令了而已。開機之后如果沒進長模式,還是可以跑16位指令的。
什么是字節序和網絡字節序?
網絡字節序 是TCP/IP中規定好的一種數據表示格式,跟CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋。
主機字節序,即字節在電腦中存放時的序列與輸入(輸出)時的序列是先到的在前還是后到的在前。
只要是Intel或AMD的x86/x64架構就一定是小端主機字節序。
三、主要內容
為什么會有“字節序”的概念,因為有不同架構的CPU所以每種CPU的保存數據方式均不同。
CPU向內存保存數據的方式有兩種,相對應解析方式也有2種:
大端序(Big Endian):高位字節存放到低位地址。
小端序(Little Endian):高位字節存放到高位地址。
整數中0x12345678, 0x12是最高位字節,0x78是最低位字節。因此大端程序中先保存最高位字節0x12(最高位字節0x12存放到低位地址)
先保存的是最低位字節0x78。從以上分析可以看出,每種CPU的數據保存方式不同。因此代表CPU 數據保存數據方式的主機字節序在不同CPU中,也各不相同。
大端序系統傳輸數據0x1234時為考慮字節序問題,直接以0x12、0x34的順序發送。結果接收端以小端方式保存數據,因此小端序接收的數據編程了0x3412。
這樣傳輸小端序系統不是沒法用了嗎?這時候就約定統一處理方式,統一按照大端序來處理就行了。怎么處理呢.net中有專門的函數來處理這個問題。