一、基本概念
位的概念:在计算机中,一个0或1称为一位(bit)。
字节:连续的八位称为一个字节(Byte),字节是计算机中可单独处理的最小单位。即以字节
为基本单位来解释信息,规定1个字节是8个二进制位。
通常1个ASCII码用1个字节存放,1个汉字用2个字节存放,双精度浮点实数用8个字节存放。
下面列表C语言中定义类型所占字节以及数据范围。
类型标识符 类型说明 长度(字节) 范围 备注
char 字符型 1 -128 ~ 127 -2^7~(2^7-1)
unsigned char 无符字符型 1 0 ~ 255 0~(2^8-1)
short int 短整型 2 -32768 ~ 32767 -2^15~(2^15-1)
unsigned short int 无符短整型 2 0 ~ 65535 0~(2^16-1)
int 整型 4 -2147483648 ~ 2147483647 -2^31~(2^31-1)
unsigned int 无符整型 4 0 ~ 4294967295 0~(2^32-1)
float 实型(单精度) 4 1.18*10-38 ~ 3.40*1038 7位有效位
double 实型(双精度) 8 2.23*10-308 ~ 1.79*10308 15位有效位
long double 实型(长双精度) 10 3.37*10-4932 ~ 1.18*104932 19位有效位
二、字节顺序由来
我们在写字符流时,因为字符型只占一个字节数,计算机只须按一个字符一个字符
写入文件即可。但是如果是处理整型时,由于整型占4个字节,所以一个整型内部的
字节存储排列的顺序直接关系到被计算机识别出来的整型值。某种意义上也可直接
理解计算机的识别顺序就是所谓的字节顺序。
三、一些有关字节顺序的解释
不同的计算机结构有时使用不同的字节顺序存储数据。例如,基于Intel的计算机存储数据
的顺序与Macintosh(Motorola)计算机就是相反的。Intel字节顺序称为“Little-Endian”,
反之Macintosh(Motorola),还有网络上采用标准是“Big-Endian”。在将应用程序从一种架
构类型迁移至另一种架构类型的过程中,经常会遇到字节排列顺序(endianness)问题。
字节排列顺序是数据元素及其单个字节在内存中存储和表示时的顺序。
通过以上分析,会发现有两类字节排列顺序:big-endian (通常为网络字节顺序)和
little-endian(主机字节顺序)。
下面是这些术语的废话解释。
Big-Endian 最重要的字节在整个内容的左端。
Little-Endian 最重要的字节在整个内容的右端。
对于big-endian处理器,在将字放在内存中时,是从最低位地址开始的,首先放入最重要的
字节。另一方面,对于little-endian处理器,如Intel处理器,首先放入的是最不重要的字
节。
说完上面的概念还是很模糊,个人认为对于不了解的字节顺序的人绝对是废话,网上大多都
是照搬照抄这几段废话。具体我们通过实际例子说明。
四、这里的解释说明
我们先看下面的代码,看完啥都明白了。
这是运行在HP-UNIX 9000/800下完整的C语言代码,即为 Big-Endian 方式。
#include <unistd.h>
void main()
{
int i=0x41424344;
printf("int Address:%x Value:%x/n",&i,i);
printf("-------------------------------/n");
char* pAddress=(char*)&i;
int j;
for(j=0;j<=3;j++)
{
printf("char Address:%x Value:%c/n",pAddress,*pAddress);
pAddress++;
}
}
编译输出(cc -g ...):
int Address:7f7f08f0 Value:41424344
-------------------------------
char Address:7f7f08f0 Value:A
char Address:7f7f08f1 Value:B
char Address:7f7f08f2 Value:C
char Address:7f7f08f3 Value:D
我们回到Windows XP下,看看这段代码的输出。Little-Endian 模式。
#include <stdio.h>
void main()
{
int i=0x41424344;
printf("int Address:%x Value:%x/n",&i,i);
printf("-------------------------------/n");
char* pAddress=(char*)&i;
int j;
for(j=0;j<=3;j++)
{
printf("char Address:%x Value:%c/n",pAddress,*pAddress);
pAddress++;
}
}
编译输出(VC 6.0):
int Address:12ff7c Value:41424344
-------------------------------
char Address:12ff7c Value:D
char Address:12ff7d Value:C
char Address:12ff7e Value:B
char Address:12ff7f Value:A
看完上面代码,应该就很清楚了,什么字节顺序?真是简单的要死!int i=0x41424344;
采用16进制,我们知道A的ACSII码是65,16进制就是41,可以理解,本例是想通过输出
A,B,C,D来验证字节顺序。我再对内存数据进行列表,相信会更有深层次的理解。
Big-Endian的内存放置顺序如下:
地址:0x7f7f08f0 0x7f7f08f1 0x7f7f08f2 0x7f7f08f3
0x41 0x42 0x43 0x44
Little-Endian的内存放置顺序如下:
地址:0x0012ff7c 0x0012ff7d 0x0012ff7e 0x0012ff7f
0x44 0x43 0x42 0x41
五、最后的说明
主机字节顺序(Host)
Little-Endian [ Intel、VAX和Unisys处理器 等]
网络字节顺序(Network)
Big-Endian [ IBM 370、Motorola和大多数RISC设计 ---- IBM 大型机和大多数Unix平台 ]
字节转换多半应用在网络编程,或者代码移植的情况下。
Unix环境下的一些相关函数:(必须包含头文件 #include <netinet/in.h>)
htons()--"Host to Network Short"
htonl()--"Host to Network Long"
ntohs()--"Network to Host Short"
ntohl()--"Network to Host Long"
Windows .Net 一些相关函数:
HostToNetworkOrder
NetworkToHostOrder
注:转载这篇文章的人比较多,所以我也不清楚谁是原创,作为感谢,我只能把我阅读到的转载这篇文章的Blog地址放在这里:
http://blog.csdn.net/yingfox/archive/2007/10/18/1831848.aspx
分享到:
相关推荐
kepware关联S7-200 PLC变量时的字节高低顺序问题
3.3.2字节顺序问题 3.4基本tcp套接字编程 3.4.1wsastartup()函数 3.4.2socket()函数 3.4.3bind()函数 3.4.4listen()函数 3.4.5accept()函数 3.4.6recv()函数 3.4.7send()函数 3.4.8closesocket()...
纠正了DAP4数据传输的字节顺序问题。 改进的错误报告。已针对版本3.20.6更新 停止CE解析错误,无法在错误消息中返回用户提供的字符串。 README现在称为README.md已针对版本3.20.5更新 内存泄漏。 修正了一些小错误...
在POSIX和Windows系统上完全受支持,没有依赖性或字节顺序问题。 用法 选项遵循通常的约定。 xxtea <-E|-D> [-h] [-o FILE] [-p PASSWORD] [FILE] 例如,将message.txt加密为file.enc (提示输入密码): $ .
最常见的有两种格式:大数在 前的字节顺序和小数在前的字节顺序。大数在前的字节顺序是指将一个多字节数的 高序字节存储在内存的起始地址;而小数在前的字节顺序则相反,将低序字节存储在 内存的起始地址。 2) 字的...
1、讲解位域结构体的原理和使用方法以及字节对齐问题; 2、讲解联合的概念以及联合体成员变量的内存分布;
本文描述了嵌入式GIS软件从x86平台移植到ARM体系结构平台的过程中遇到的浮点数存储字节顺序问题,并对该问题进行了详细分析,最终确定是ARM体系结构下浮点数的Middle-Endian存储问题,并提供了解决方案。希望本文的...
嵌入式软件易于出错问题分析 1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结
在嵌入式GIS软件从x86体系结构下移植到ARM体系结构的过程中,遇到了浮点数据存储字节顺序的问题。该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入
1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 全局变量共享访问和死锁问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结
在嵌入式GIS软件从x86体系结构下移植到ARM体系结构的过程中,遇到了浮点数据存储字节顺序的问题。该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入式
使用 NodeJS 编写前端工具时,操作得最多的是文本文件,因此也就涉及到了文件编码的处理问题。我们常用的文本编码有 UTF8 和 GBK 两种,并且 UTF8 文件还可能带有 BOM。在读取不同编码的文本文件时,需要将文件内容...
从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这...
问题4-27:在因特网中最常见的分组长度大约是多少个字节? 问题4-28:IP数据报的最大长度是多少个字节? 问题4-29:IP数据报的首部的最大长度是多少个字节?典型的IP数据报首部是多长? 问题4-30:IP数据报在传输的...
一、什么是字节对齐计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定...
本文主要讲解以下内容 (1)CAsyncSocket类编程模式。 (2)CSocket类编程模式。 (3)CSocketFile类和CArchive类简介。... 要自己编写程序处理阻塞、字节顺序以及Unicode与MBCS之间的转换等问题。
GBK,BIG5,UTF-16BE(Unicode big-endian字节顺序),UTF-16LE(Unicode little-endian字节顺序),UTF-8 默认输入编码方式为GBK,默认输出编码方式为UTF-16BE; 该类别提供两个函数用来修改输入和输出编码方式: 修改...
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端和大端两种字节顺序,这两种你只需要深刻地记住其中的一种就可以,另一种恰好和它相反,不需要刻意记忆了,那么我们就记住“大端模式”吧。...
揭示硬件架构的设计艺术,涵盖作者从事芯片设计...第7章讨论使用字节顺序的方法;第8章阐述去抖动技术,以消除毛刺和噪声。第9章介绍电磁干扰的原理、规程、标准和认证,以及电磁干扰的影响因素和减少电磁干扰的方法。