TCP/IP网络编程之字节序和网络字节序
一、概要
本篇文章主要讲解基于.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中有专门的函数来处理这个问题。
TCP/IP网络编程之字节序和网络字节序的更多相关文章
- 【TCP/IP网络编程】:01理解网络编程和套接字
1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...
- [C#网络编程系列]专题一:网络协议简介
转自:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html 因为这段时间都在研究C#网络编程的一些知识, 所以 ...
- Python网络编程(OSI模型、网络协议、TCP)
前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...
- 一个项目看java TCP/IP Socket编程
前一段时间刚做了个java程序和网络上多台机器的c程序通讯的项目,遵循的是TCP/IP协议,用到了java的Socket编程.网络通讯是java的强项,用TCP/IP协议可以方便的和网络上的其他程序互 ...
- Linux IPC tcp/ip socket 编程
模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...
- 子网划分、变长子网掩码和TCP/IP排错__子网、掩码、网络汇总
1.如何创建子网? 要创建子网,就需要从IP地址的主机部分中借出一定的位,并且保留它们用来定义子网地址.这意味着用于主机的位减少,所以子网越多,可用于定义主机的位越少. 2.子网划分的好处: 1)缩减 ...
- Linux 网络编程基础(1)--网络相关的数据结构及转化函数
在Linux下进行网络编程,使用的语言一般为C.就个人感受而言,在Linux下进行网络程序的编写,重要的不是代码能力要多强,而是对Linux的网络编程思想的理解和对Linux网络数据结构的掌握.如果想 ...
- 第三模块:面向对象&网络编程基础 第2章 网络编程
01-计算机基础 02-什么是网络 03-五层协议详解 04-传输层详解 05-什么是Socket 06-基于socket实现简单套接字通信 07-在简单套接字基础上加上通信循环 08-客户端与服务端 ...
- python基础(29):网络编程(软件开发架构、网络基础、套接字初使用)
1. 软件开发架构 我们了解的程序之间通讯的应用可分为两种: 第一种是应用类:qq.微信.百度网盘.腾讯视频这一类是属于需要安装的桌面应用. 第二种是web类:比如百度.知乎.博客园等使用浏览器访问就 ...
- linux网络编程基础--(转自网络)
转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...
随机推荐
- PHP strrev() 函数
实例 反转字符串 "Hello World!": <?php高佣联盟 www.cgewang.comecho strrev("Hello World!") ...
- 剑指 Offer 58 - I. 翻转单词顺序
本题 题目链接 题目描述 我的题解 方法一:库函数split() 要注意str.split()函数: 字符串str前有 n 个空格时,分割出来的字符串列表中会多出 n 个空字符串: 字符串str某两个 ...
- SSH整合-hibernate
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property& ...
- 在不同网段使用 VLAN 通信 - SVI,单臂路由
在 VLAN 这篇文章中知道,设置 VLAN 目的是隔离大型的广播域,将其分成很小的广播域,从而更好的管理.但也就带来了一些问题:如流量不能在不同的 VLAN 间通信. 而为了解决这个问题,可以采用如 ...
- 【每日一个小技巧】Python | input的提示信息换行输出,提示信息用变量表示
[每日一个小技巧]Python | input的提示信息换行输出,提示信息用变量表示 在书写代码的途中,经常会实现这样功能: 请输入下列选项前的序号: 1.选择1 2.选择2 3.选择3 在pytho ...
- 调用thrift出现No handlers could be found for logger "thrift.transport.TSocket"
1.问题 使用thrift版本为0.10,在0.8没有这个问题 其中ncTAgent是代码中封装的thrift接口的结构,在thrift服务端没有启动的时候,应该拋错为连接不到.但是拋错的堆栈输出之前 ...
- 一文打尽Java抽象类和接口的相关问题
相关文章: <面向对象再探究>:介绍了面向对象的基本概念 <详解Java的对象创建>:介绍了对象的创建.构造器的使用 <一文打尽Java继承的相关问题>:介绍了继承 ...
- Jdbc Template初步了解
JdbcTemplate简介 Java语言提供了jdbc来访问数据库,在jdbc api中需要手动的获取和释放连接等资源,使用起来需要做许多重复的工作.Spring在jdbc api的基础上做了抽象和 ...
- 07-NABCD项目分析
时 间:2020.3.31 参加人员:向瑜.赵常恒.刘志霄 讨论记录内容: NABCD模型 ·N(need)-向瑜 你的创意解决了用户的什么需求? 1. 随时随地记录个人收支的明细,清楚明白的知 ...
- ngnix.conf的配置结构
1.ngnix.conf的配置结构 2.部分配置文件说明 #worker进程可操作的用户 #user nobody; #设置worker的个数 worker_processes 1; #错误日志 #e ...