一、概要
本篇文章主要讲解基于.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中有专门的函数来处理这个问题。