文档章节

大小字节序的深入理解和鉴定系统字节序方法

沙米笔记
 沙米笔记
发布于 2016/03/26 22:22
字数 1268
阅读 729
收藏 34

        最近在项目中的soket通信时,遇到了大小字节序问题和网络传输时的字节序问题,现在给大家整理一下,希望大家对字节序有个比较深入的了解,其实理解了就很简单的。

 开始遇到的问题:

      1、本地的数据通过网络传输然后在目的地解析网络上的数据,字节序是如何统一的

      2、字节序不同,数据(如0xFF00)存入内存地址中位置不同(大字节序:FF--低地址位   00--高地址位  ;小字节序: 00--低地址位  FF--高地址位),为什么读出的值都是0xFF00

下面让我们带着问题来理解:

         大字节序:大端有效 ,高位数据先放入低地址内存  , 低位数据放入高地址内存

        小字节序:小端有效,低位数据先放入低地址内存 , 高位数据再放入高地址内存       

        注意:描述的是将数据(肉眼看到的)放入内存中的地址(计算机的硬盘内存中)

        然后看一下图示吧:

    相信大家对遇到的第二个问题已经知道结果了吧,现在再来看看第一个问题。

        网络字节序:是大字节序,在把数据进行网络传输时,要保证自己传输到网络上的数据时大字节序。

       再来看看图示吧:

    1号线路:发数据和接收数据都不需要转序,因为自己是和网络都是大字节序

    2号线路:发数据和接收数据需要转序,因为自己是小字节序,网络都是大字节序,才能保证自己本系统的数据永远都是小字节序。可能高级语言(java、C#屏蔽了字节序,大家感受不到,那是因为高级语言内存进行封装和处理了)。

    补充一下:如果发端和收端都是小字节序,可以不转序,但是这样做可扩展不高,如果收端是大字节序的话,人家默认为发过来的数据都是网络字节序(大字节序),这样处理就很混乱了。

    好了,现在大家对第一个问题也清楚了吧。

鉴定大小字节序的C/C++语言程序

最后让我们来看看鉴定大小字节序的C/C++语言程序吧

#include <stdlib.h>
#include <string.h>

int main()
{
	/*将结合体的整型值赋值为1,如果是小字节序,小端有效,低地址写入的就是1,读出字符ch就是1 
			如果是大字节序,大端有效,低地址写入的就是0,读出字符ch就是0*/
	data.i = 1;
	if(data.ch)
	{
		printf("this system is  small-endian\n");	
	} 
	else
	{
		printf("this system is  big-endian\n");		
	}
	
	return 0;
}

    原因:将结合体的整型值赋值为1,如果是小字节序,小端有效,低地址写入的就是1,读出字符ch就是1 

                                如果是大字节序,大端有效,低地址写入的就是0,读出字符ch就是0

    检验大小字节序的方法很多,本人认为这个方法比较简单,容易理解。

字节序转化函数htons、htonl、ntohs、ntohl应用

    重要>>>字节序转化,只是针对二字节、四字节的数据类型,对于单字节和数据区(本质也是单字节的数组)不需要转化

    注意:在使用转序函数时,函数内部会去判断本机字节序,决定要不要转

#include <iostream>
using namespace std;
/*windows下的头文件;linux下是#include <arpa/inet.h>*/
#include<Winsock2.h>

int main(int argc,char *argv[])
{
	/*常用方法(注意,在使用转序函数时,内部会去判断本机字节序,决定要不要转)
	****** host(本地)-->net(网络):
	uint32_t htonl(uint32_t hostlong);
	uint16_t htons(uint16_t hostshort);

	****** net(网络) -->host(本地):
	uint32_t ntohl(uint32_t netlong);
	uint16_t ntohs(uint16_t netshort);
	*/
	unsigned int srcNum = 0xff;
	unsigned int netNum  = htonl(srcNum);
	printf("src-->net: srcNum=0x%x  netNum=0x%x\n",srcNum,netNum);

	unsigned int toNum = ntohl(netNum);
	printf("net-->to : netNum=0x%x  srcNum=0x%x  \n",netNum,toNum);

	system("pause");
	return 0;
}

 此代码是在windows环境下编译,如果编译报错error LNK2019: 无法解析的外部符号 _ntohl@4,原因是没有引入ws2_32.lib库,只要在 项目->属性->配置属性->链接器->输入 然后在附件依赖项添加ws2_32.lib 

巩固练习--IP的存放

1、 IP(无符号整型,如0x80702101)在大、小字节序的系统中的内存是怎么存放的(把这个IP看成4字节的数组unsigned char arry[4],则数组中每个元素各是多少呢?)提示:数组的下标越大,地址就越大。

小字节:arr[0]=0x01      arr[1]=0x21      arr[2]=0x70    arr[4]=0x80

大字节:arr[0]=0x80      arr[1]=0x70      arr[2]=0x21    arr[4]=0x01

最后希望能对大家有帮助,有什么问题请留言,谢谢。

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
沙米笔记
粉丝 29
博文 42
码字总数 45024
作品 0
深圳
程序员
加载中

评论(3)

沙米笔记
沙米笔记

引用来自“skyim”的评论

小字节序:小端有效,低位数据先放入地址内存 , 高位数据放入低地址内存 ?
低位数据先放入低位地址内存,高位数据放入高位地址内存
谢谢你的提醒,笔误了,已改过来了。小字节序:小端有效,低位数据先放入低地址内存 , 高位数据再放入高地址内存
skyim
skyim
小字节序:小端有效,低位数据先放入地址内存 , 高位数据放入低地址内存 ?
低位数据先放入低位地址内存,高位数据放入高位地址内存
沙米笔记
沙米笔记
0
C/C++中字节序、类型转化的深入理解

如果将字节序、类型转化单独一个拿出来说时,大家可能都觉得很简单,但是理解的不深入。如果将其结合起来探讨,可能我们就会理解的很透彻。 关于字节序和类型转化的基础,大家如果不太理解,...

沙米笔记
2016/11/08
229
0
最简单的方式教你理解大小端字节序

学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题。 什么是字节序? 字节序,简单来...

暮回_梓
06/26
0
0
PHP: 深入pack/unpack

PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用。其中不乏大公司,如腾迅、盛大、淘米、新浪等。在对性能要求比较高的项目中,PHP也逐渐演变成一门前端语言,用于访问后端...

陈亦
2014/01/24
0
21
详解大端模式和小端模式

详解大端模式和小端模式 一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一...

长平狐
2013/06/03
138
0
大端模式&小端模式、主机序&网络序、入栈地址高低问题

一、大端模式&小端模式 所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作...

AlphaJay
2010/06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

LSM-Tree 大数据索引技术

一、LSM-Tree概述 核心思想就是放弃部分读能力,换取写入能力的最大化。LSM-Tree ,这个概念就是结构化合并树(Log-Structured Merge Tree)的意思,它的核心思路其实非常简单,就是假定内存...

PeakFang-BOK
15分钟前
0
0
vue.js响应式原理解析与实现

从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染。之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新并且重新...

peakedness丶
21分钟前
0
0
Weblogic补丁升级操作步骤

linux平台: weblogic1036 1:停止weblogic服务 2:打FMJJ补丁 a:获取weblogic_home目录并执行命令:export weblogic_home="/weblogic/wls1036_x64",(此目录一般为目录“user_projects”上...

fang_faye
34分钟前
0
0
04-《Apache Tomcat 9 User Guide》之部署项目

1.Introduction Deployment is the term used for the process of installing a web application (either a 3rd party WAR or your own custom web application) into the Tomcat server. 部......

飞鱼说编程
35分钟前
0
0
一位十年的老码农他眼中的区块链

大家可能已经听说过比特币、莱特币、以太币等等,以及它们作为一种新货币在市场上的潜力。 有趣的是,很多投资比特币的人也提到了区块链之类的东西。 显然,这项技术是比特币等其他东西的"基...

小刀爱编程
42分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部