关于偏移量的理解

偏移量是个很神奇的东西,好多学科,好多方面都包含有他的知识。今天主要是想和大家分享一下自己关于偏移量的理解,以新手向为主的理解,那么当然是言简意赅,然后作为抛砖引玉之用吧,希望能有各路大神来补充说明。


产生灵感的来源主要来自于哪里呢?今天接触了一些关于双向循环链表的东西,用老师的话讲叫做“火车皮拉货”,在lxr上面的定义有些绕口,但是画图以后就能清楚的看到,以前接触的链表,形象比喻叫做“把车皮和货物绑在一起”,


而现在叫做“火车拉货”,

怎么取都可以哦!


再加上他的灵活性,一个节点可以同时存在于两个连表中,很好玩啊!这样的话不是什么东西都可以连接在一起了吗?


那么接下来就讲到偏移量了。熟悉基础和计算机的大神们当然知道偏移量的原理和作用,下午的时候我就是纠结于“偏移量是干什么的”这个问题。


那么首先简单说说偏移量这个东西。就拿container_of这个家伙来说说吧。

#define container_of(ptr, type, member) ({             /
         const typeof( ((type *)0)->member ) *__mptr = (ptr);     /
         (type *)( (char *)__mptr - offsetof(type,member) );})

typeof是取当前变量的类型,那么看那个括号里,是强制转化为了指针,然后由ptr将mptr初始化。ptr呢就作为一个结构体中的指针定义并初始化了。

既然是指针那么我们便可以取到他的地址,而下面的offsetof便是偏移量了。用指针的地址减去偏移量即是结构体开头所在。




为什么要找到结构体的开头呢?

举个例子:假设你要去火车上的某个位置找一个人,而那个人具体在哪里你并不知道,只能通过查看火车头上提供的座位信息才能确认的话,那么你的首要任务就是先找到火车头,确认你要找的火车车厢,然后才能找到你想要找的人。放在结构体里面来看的话,你就好比是那个ptr,那个已知知位置的指针,而你从现在所在位置到达火车头所走过的距离就是偏移量。


有人可能会问,为什么我要走这个偏移量呢?开始的时候我也不明白,朋友告诉我是因为读取数据的规定要求这样做。但是后来我想通了。

原因其实也很简单,作为计算机,他所能识别的语言只有“0”、"1",而它存放的数据也是连续的,这和他的构造也有一定的关系。如果我们把一个结构体看作是一个装满数据的小盒子的话,即便是我们知道要找的信息在盒子里,我们也只能是通过从头到尾遍历查找的方式确认信息到底在什么地方。而因为我们开始并不知道ptr指针在数据盒子所处的相对位置,因此我们需要确定他的具体位置所在。亦或是我们知道了要找的数据大致在什么位置,也得首先确定数据头的位置,才能够确定出信息具体的位置所在。

这个用火车的例子也能够说明白。我们可能知道要找的人大致在哪个车厢,但是我们现在所在的位置并不是确定的,因此为了确保位置的准确性,我们需要找到火车头,但后在一节节车厢或者是确定到某个车厢来找到我们需要找到的人。




罗嗦了这么多,不知道大家有没有看懂呢?我是一个喜欢把抽象的东西具体化的人,本身这些理论就比较抽象,更何况“不懂得生活的人就不懂得代码”,希望我的生涩的凌乱的语句能够帮助大家从一定角度理解偏移量这个可爱的家伙。

### 使用元组表示一行标记数据 在描述中提到,一行标记数据可以通过一个元组来表示,其中包含两个整型数值的偏移量信息。这两个偏移量分别对应于 `.bin` 压缩文件中的压缩数据块的起始偏移量以及解压后未压缩数据的起始偏移量[^1]。 #### 创建元组的方式 元组是一种不可变的数据结构,通常用来存储一组有序的对象。创建元组的方法如下所示: ```python offset_tuple = (start_offset_compressed, start_offset_uncompressed) ``` 上述代码片段定义了一个名为 `offset_tuple` 的元组,它包含了两个整数类型的值:`start_offset_compressed` 和 `start_offset_uncompressed`。前者表示的是压缩数据块在 `.bin` 文件中的起始位置,而后者则指代解压之后原始数据的起始地址[^5]。 #### 数据块的具体构成 除了理解如何利用元组记录这些重要的偏移量之外,还需要注意到实际应用中的压缩数据块是由头部信息和具体的压缩数据共同组成的。头部信息占用固定的9字节空间,其中包括: - 1 字节 (`UInt8`) 来指定所采用的压缩算法; - 接下来的4字节 (`UInt32`) 存储压缩后的数据长度; - 另外4字节 (`UInt32`) 记录压缩之前的数据尺寸[^2]。 这种设计使得程序能够快速解析并定位到特定的压缩区块及其关联的未压缩内容起点。 #### 示例代码展示 下面给出一段简单的 Python 实现例子,演示了怎样构建这样的元组,并假设我们已经有了某些预设好的偏移数值: ```python # 定义压缩数据块的起始偏移量与解压后数据的起始偏移量 start_offset_compressed = 1024 start_offset_uncompressed = 2048 # 构建元组形式的一行标记数据 offset_info = (start_offset_compressed, start_offset_uncompressed) print(f"Compressed Data Block Start Offset: {offset_info[0]}") print(f"Uncompressed Data Start Position After Decompression: {offset_info[1]}") ``` 此脚本首先初始化了两个变量——分别是压缩区间的初始点和恢复原状后的首个字节所在之处;接着运用这两项参数生成了一条完整的索引记录作为元组存在下来供后续操作调用。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值