(From《Computer Systems,A Programer's Perspective》)在几乎所有的机器上,多字节对象被存储为连续的字节序列,对象的地址为所使用字节序列中最低字节地址。某些机器选择在存储器中按照从最低有效字节到最高有效字节的顺序存储对象,这种最低有效字节在最前面的表示方式被称为小端法(little endian)(e.g.:Intel处理器上运行Linux,NT);某些机器则按照从最高有效字节到最低有效字节的顺序储存,这种最高有效字节在最前面的方式被称为大端法(big endian)(e.g.:Sun Microsystem UltraSPARC运行Solaris)。一般情况下,我们不必考虑字节顺序,但在下列三种情况下,字节顺序变得非常重要:

1. 在不同类型的机器之间通过网络传送二进制数据时。一个常见的问题是当小端法机器产生的数据被发送到大端法机器或者反之时,接受程序会发现,字(word)里的字节(byte)成了反序的。为了避免这类问题,网络应用程序的代码编写必须遵守已建立的关于字节顺序的规则,以确保发送方机器将它的内部表示转换成网络标准,而接受方机器则将网络标准转换为它的内部标准。

2. 当阅读表示整数的字节序列时。这通常发生在检查机器级程序时,e.g.:反汇编得到的一条指令:
80483bd: 01 05 64 94 04 08        add %eax, 0x8049464

3. 当编写规避正常的类型系统的程序时。(e.g.:下面的几个代码示例。)

判断当前机器环境是大端法还是小端法:

int i=1; 
unsigned char * pointer = &i;
if(*pointer)//或pointer[0]
    printf("Little Endian"); 
else printf("Big Endian");

打印程序对象的字节表示:

#include <stdio.h>
#include <stdlib.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, int len)
{
     int i;
     for(i=0;i<len;i++)
         printf(" %.2x ", start[i]);
     printf(" ");
}

void show_int(int x)
{
     show_bytes((byte_pointer)&x, sizeof(int));//使用sizeof而不是使用魔数4 
}

void show_unsignedInt(unsigned int x)
{
      show_bytes((byte_pointer)&x,sizeof(unsigned int));
}

void show_short(short x)
{
      show_bytes((byte_pointer)&x,sizeof(short));
}

void show_unsignedShort(unsigned short x)
{
      show_bytes((byte_pointer)&x,sizeof(unsigned short));
}

void show_float(float x)
{
     show_bytes((byte_pointer)&x, sizeof(float));
}

void show_pointer(void *x)
{
     show_bytes((byte_pointer)&x, sizeof(void *));
}
 
int main(int argc, char *argv[])
{
    int val=0x12345678;
    byte_pointer valp=(byte_pointer)&val;
    show_bytes(valp,1);
    show_bytes(valp,2);
    show_bytes(valp,3);
    show_bytes(valp,4);
    system("PAUSE");    
    return 0;
}
本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2006/12/19/601222.html,如需转载请自行联系原作者

应考虑字节顺序(大小端问题)的几种情况相关推荐

  1. 高地址和低地址、高字节低字节、大小端模式的转换,存储顺序

    参考博客 https://blog.csdn.net/ce123_zhouwei/article/details/6971544 https://my.oschina.net/alphajay/blo ...

  2. 高地址和低地址、高字节低字节、大小端模式(及如何互换),存储顺序(!!)

    参考博客 https://blog.csdn.net/ce123_zhouwei/article/details/6971544 https://my.oschina.net/alphajay/blo ...

  3. 大小端模式以及两种判断方法

    文章目录 基本概念 判断方法 END 基本概念 首先来看某百科定义: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中. 小端模式,是指数据的高字节保存在内存的高地址 ...

  4. 大小端字节序介绍以及判断当前环境字节序的程序【C语言】

    文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...

  5. Python 字节串比特串转换以及大小端相关的几个方法

    大端 小端 介绍 查看当前系统是大端还是小端:sys.byteorder,Windows是小端的,而小端在我们看来是和常规反向地 关于大小端的知识,推荐几篇文章: CPU架构决定大小端模式 理解大端与 ...

  6. 大小端字节序知识详解

     计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian). 举例: 数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11. 大 ...

  7. python 大小端转换_Python 字节串转换以及大小端相关的几个方法

    查看当前系统是大端还是小端:sys.byteorder,Windows是小端的,而小端在我们看来是和常规反向地 字节串的赋值表达式 bytes((1,2,ord('1'),ord('2'))) # 可 ...

  8. 大小端与高位先行、低位先行

    近期学习嵌入式过程中混淆了大小端和高位先行.低位先行的区别,现总结如下. 首先地址信号的顺序: 一个地址信号是一个16位的二进制数字,最右边的是第1位,最左边的是第16位.低8位指的是第1位到第8位, ...

  9. 鲜为人知的大小端问题

    文章目录 鲜为人知的大小端问题 1. 大小端引起的问题 2. 大小端模式理解 3. 三种大小端转换方法 鲜为人知的大小端问题 1. 大小端引起的问题 在进行通信数据拆包解析,不同单片机数据存储时,因为 ...

  10. C语言-MSB/LSB大小端序

    一.MSB和LSB 首先我们要理解什么是MSB和LSB.数据在计算机里面都是二进制存储的,二进制的最高位为MSB,最低位是LSB. MSB:Most Significant Bit(最高有效位),也就 ...

最新文章

  1. 北大30岁女博导获2019 IEEE青年成就奖,全球仅三人,深耕微纳电子、神经形态计算...
  2. 比买电脑还便宜的桌面虚拟化方案
  3. 摆脱困境:向REST API添加验证
  4. mysql示例数据库
  5. Idea Marketplace 加载很慢 加载不出来
  6. 数据结构 之 图的存储和遍历
  7. kaggle实战_4解决高维数据分类/回归问题--房价预测
  8. webpack 命令
  9. android与服务器交互总结(json,post,xUtils,Volley)
  10. html导入夸克,index.html
  11. Eclipse快速导入继承类的方法
  12. 线程--匿名内部类实现多线程的2种方式
  13. python游戏编程之环境配置
  14. html5前端图片压缩,大小可配置
  15. linux改变cpu型号,怎么用linux查看cpu型号
  16. 如何使用md5码验证文件的一致性
  17. 表格的下拉放大 ----------王朋
  18. c语言共阳极数码管的数据,LY-51S(STC89C52R):8个共阴极数码管-程序(1)
  19. 呆萌却实际可怕的动物:蛇鹫会踢腿 大熊猫攻击凶猛
  20. 4种预测市场表现的方法

热门文章

  1. 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏...
  2. AngularJs(Part 3)--注册服务
  3. 12月22日 冬至 隋文帝赏柳上上签
  4. Day04:继承的意义(下) / 访问控制 / static和final
  5. Spring的三种注入方式
  6. 005 Aspectj的引入
  7. Linux Shell编程参考大全
  8. Linux的用户和组
  9. ​Web安全测试解决方案
  10. Maven - 安装 配置