深入理解计算机--字节顺序

来源:互联网 发布:精准扶贫平台 网络 编辑:程序博客网 时间:2024/06/05 11:35

在看深入理解计算机这本神书时看到一个地方挺有意思的。

一个多字节对象在内存中的排列顺序是什么样子的?在几乎所有的机器上多字节对象被存储为连续的字节序列,对象使用的地址为所用字节中的最小地址。例如假设一个32位系统下的int变量x的地址为0x100即&x的值为0x100,那么x的四个字节将会被存储在存储器的0x100、0x101、0x102、0x103位置。

它们的排列顺序主要有两种

小端法(little-endian)

最低有效字节排列在最前面的方式叫做小端法。比如32位int值为0x0123456,起始地址为0x100,那么在应用小端法的机器中,表示为
地址0x1000x1010x1020x103值67452301大多数使用intel兼容的处理器的机器都采用小端法

大端法(big-endian)

与小端法相对应,将最高有效字节排列在最前面的方式叫做大端法。还是一样的例子,32位int值为0x0123456,起始地址为0x100,那么在应用大端法的机器中,表示为
地址0x1000x1010x1020x103值01234567在书上说大多IBM与Sun Microsystems的机器都采用这种规则,不过感觉我是永远也用不上了
还用许多比较新的机器采用双端法(bi-endian),就是可以配置成大端或小端的机器来运行

总结与应用场景

没有技术上的原因选择哪个字节顺序排列,只要一直坚持一种就好了
下面是按字节输出内存中的值代码
下面是测试函数
调用
test_show_bytes(0x01234567);
可以得到结果
67 45 23 01b4 a2 91 4bd4 fb 2d 00


应用场景一  网络数据传输

对于程序员来说选择,机器所使用的字节排列顺序是不可见的,无论为那种排列编程都会得到相同的结果。但是在有些时候字节顺序会成为问题。首先是在不同类型的机器之间通过网络传送二进制数据时,一个常见的问题是当小端法机器产生的数据传输到大端法机器时接受程序里的字节成了反序的。为了避免由于这个原因而产生错误网络程序的代码编写必须遵守已建立的关于字节顺序的规则,以确保发送方机器将他的内部表示转换成网络标准,而接受方将网络标准转化为它的内部表示。


应用场景二 机器码与某些破解工作

在查看和更改机器级代码时需要注意显示的内存地址之类的值可能是以大端法或者小端法排列的。另外在某些破解时也要注意机器采用的是大端法或者小端法,如在安装黑苹果时修改DSDT文件时,里面的值大多使用小端法排列
0 0
原创粉丝点击