`
想gohome
  • 浏览: 2398 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

字节顺序的问题

    博客分类:
  • c++
 
阅读更多
一、基本概念

位的概念:在计算机中,一个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关联变量高低顺序问题

    kepware关联S7-200 PLC变量时的字节高低顺序问题

    精通Windows Sockets网络开发:基于Visual C++实现-带源码

    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()...

    libdap4:包含DAP2和DAP4支持的新版本的libdap

    纠正了DAP4数据传输的字节顺序问题。 改进的错误报告。已针对版本3.20.6更新 停止CE解析错误,无法在错误消息中返回用户提供的字符串。 README现在称为README.md已针对版本3.20.5更新 内存泄漏。 修正了一些小错误...

    xxtea:100%XXTEA认证的分块文件加密

    在POSIX和Windows系统上完全受支持,没有依赖性或字节顺序问题。 用法 选项遵循通常的约定。 xxtea &lt;-E|-D&gt; [-h] [-o FILE] [-p PASSWORD] [FILE] 例如,将message.txt加密为file.enc (提示输入密码): $ .

    网络程序设计复习题.doc

    最常见的有两种格式:大数在 前的字节顺序和小数在前的字节顺序。大数在前的字节顺序是指将一个多字节数的 高序字节存储在内存的起始地址;而小数在前的字节顺序则相反,将低序字节存储在 内存的起始地址。 2) 字的...

    吕鑫:最博大精深的C语言视频教程 第22天 【第3堂课】位域结构体与联合体

    1、讲解位域结构体的原理和使用方法以及字节对齐问题; 2、讲解联合的概念以及联合体成员变量的内存分布;

    ARM体系下浮点数Middle-Endian问题的处理

    本文描述了嵌入式GIS软件从x86平台移植到ARM体系结构平台的过程中遇到的浮点数存储字节顺序问题,并对该问题进行了详细分析,最终确定是ARM体系结构下浮点数的Middle-Endian存储问题,并提供了解决方案。希望本文的...

    【嵌入式】之中兴嵌入式培训-嵌入式软件易于出错问题分析

    嵌入式软件易于出错问题分析 1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结

    嵌入式系统/ARM技术中的如何处理ARM体系下浮点数Middle-Endian问题

     在嵌入式GIS软件从x86体系结构下移植到ARM体系结构的过程中,遇到了浮点数据存储字节顺序的问题。该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入

    (中兴通讯内部培训)嵌入式软件易于出错问题分析专题(2).ppt

    1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 全局变量共享访问和死锁问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结

    嵌入式系统/ARM技术中的ARM体系下浮点数Middle-Endian问题的处理

     在嵌入式GIS软件从x86体系结构下移植到ARM体系结构的过程中,遇到了浮点数据存储字节顺序的问题。该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入式

    使用Node.js处理前端代码文件的编码问题

    使用 NodeJS 编写前端工具时,操作得最多的是文本文件,因此也就涉及到了文件编码的处理问题。我们常用的文本编码有 UTF8 和 GBK 两种,并且 UTF8 文件还可能带有 BOM。在读取不同编码的文本文件时,需要将文件内容...

    C51程序设计中的编程中的字节对齐问题

    从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这...

    计算机网络常见问题解答

    问题4-27:在因特网中最常见的分组长度大约是多少个字节? 问题4-28:IP数据报的最大长度是多少个字节? 问题4-29:IP数据报的首部的最大长度是多少个字节?典型的IP数据报首部是多长? 问题4-30:IP数据报在传输的...

    关于C++内存中字节对齐问题的详细介绍

    一、什么是字节对齐计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定...

    VC-internat.rar_CAsyncSocket_CSocketFile_carchive_csocket_vc cso

    本文主要讲解以下内容 (1)CAsyncSocket类编程模式。 (2)CSocket类编程模式。 (3)CSocketFile类和CArchive类简介。... 要自己编写程序处理阻塞、字节顺序以及Unicode与MBCS之间的转换等问题。

    Encoding

    GBK,BIG5,UTF-16BE(Unicode big-endian字节顺序),UTF-16LE(Unicode little-endian字节顺序),UTF-8 默认输入编码方式为GBK,默认输出编码方式为UTF-16BE; 该类别提供两个函数用来修改输入和输出编码方式: 修改...

    正确区分大小端模式

    字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端和大端两种字节顺序,这两种你只需要深刻地记住其中的一种就可以,另一种恰好和它相反,不需要刻意记忆了,那么我们就记住“大端模式”吧。...

    硬件架构的艺术 数字电路的设计方法与技术

    揭示硬件架构的设计艺术,涵盖作者从事芯片设计...第7章讨论使用字节顺序的方法;第8章阐述去抖动技术,以消除毛刺和噪声。第9章介绍电磁干扰的原理、规程、标准和认证,以及电磁干扰的影响因素和减少电磁干扰的方法。

Global site tag (gtag.js) - Google Analytics