[地震fcnt格式读取]大端字节序(big endian)和小端字节序(little endian)

[地震fcnt格式读取]大端字节序(big endian)和小端字节序(little endian)

最近被导师要求做读地震数据fcnt格式的数据程序,发现fcnt格式里面主要都是些二进制的东西,炮头信息毫无例外的都是按照bytes位置给列出的.使得我不得不开始重新回忆早就丢掉的字符(Ascii,Unicode,UTF-8),字节(bit,byte)这些东西.
为了能赶紧搞出来,当然是抛弃C,C+,fortran这些编译语言了,python才是心头好啊.
在这里不会讨论fcnt具体的道头信息,至于题目为啥写个地震格式读取,当然是忽悠同行们点开这个啦.当然理解了big-endian和little-endian这两个概念对于读取像fcnt,segy,segd这些地震上的二进制文件是相当有利的.
好了,在具体将big-endian和little-endian之前,我们先复习下大学里C语言课时就讲述过得一些概念.这样我们才能愉快的讲下去.
* bit 和 byte
我们知道计算机使用的都是二进制码,1个bit就是一个位,这个位仅可以是0,1之中的一个,一个byte指的是一个字节,

1byte=8bits 1 b y t e = 8 b i t s

简单的将单位制写在这里:

1byte = 8 bits
1 Kb = 1024 bytes
1 Mb = 1024 Kb
1 Gb = 1024 Mb
1 Tb = 1024 Gb

1 byte(1个字节) 有8个bit,就是说1byte能够表示(0~255)之间的整数.
位数和可以表示的最大整数个数之间的关系:

2bits1 2 b i t s − 1

这里我们就需要提一下编码方式了,计算机内部只有0,1.而人是很难理解这种排列的意义的.所以我们人就规定了具体用哪些二进制数字表示哪个字符了,同时为了统一大家的认识,不能你发布一种,我在搞一种,所以就有了统一的编码方式,.
ASCII 就是因为美国佬的强大,而在早起开始存在的,ASCII码利用一个字节来表示一个字母或者符号,但是问题来了,这个只是美国佬搞出来的,中文,日文,韩文这些可不是1个字节就能表示的了.(后来也出现了一些变种的 ASCII码这里不提及了)

ASCII表

Unicode又被成为统一码,万国码,单一码,是计算机科学领域里的一项业
界吧标准,上面说道美帝提出的适合他们的ASCII码,同样为了表示中文,我们也搞
了一套成为GB2312编码.后来大家还是商量商量决定搞一套统一的,车同轨,书同
文,老祖宗说的总是对的.Unicode被搞出来将日文,韩文等等这些都统一到一起
了,这样大家都不乱了,这样8个bit一个字节(byte),位置就不够了.没办法,就搞
成了2bytes的编码方式,将原来单字节的英文编码的高字节都填为0.

这里需要提出的是Unicode的正式公布是1994年,而python在这之前就已经搞出
来了,所以python2.x这些都是不支持Unicode的,幸运的是常用的3.6版本就
有Unicode的了.这个就是为啥好多3.6的程序中print(b’test’),这个b就是
为了和python2.x能够整合,str在3.6中是Unicode格式,2.7中是ascii码.加
上b,3.6中就变成了ascii.

UTF-8全称(8-bit Unicode Transformation Format),是一种针对Unicode的可变长度字符编码.我们提到Unicode解决了计算机中使用ASCII意外
更多的字母,字符等内容,UTF-8就是使用变字节数.这样省存储空间在python中我们经常就会添
加让其可以使用UTF-8,不然中文显示很麻烦.
这里我只是提一下python提供了标准库struct模块来解决bytes和其他二进制数据类型的转换:

import struct
#包含了struct.pack()"把任意数据类型变成bytes."
#     struct.unpack()"把bytes变成相应的数据类型."
struct.pack('>I', 10240099)
struct.unpack('>IH',b'\xf0\xf0\xf0\x80\x80')
#pack 的第一个参数'>'表示字节顺序是big-endian,也就是网络序,
#I 表示4字节无符号整数.H表示2字节无符号整数.

好了,现在我们可以开始解释big-endian,little-endian

@import "Big_little_Endian.jpg"

    大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
    小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。

上面这幅图可以很明显的看出这两种存储方式的差别.Big-Endian是比较合乎我们人的认识的排列方式了.
这里主要参考的是阮一峰的博客,例子也是里面的:
例如十六进制的写法.
0X1234567

@import "BIG_LITTLE.gif"

图中上面那行就是存储内存表示,0X100,0X101,0X102,0X103,依次增加的内存位置编号.Big-Endian,高位字节放在低储存位置,反之就是Little-Endian的方式.
~ 只用读取的时候,才必须区分字节序,其他情况下都不用考虑

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值