可移植性问题:对齐数据,字节序问题等

时间:2011-04-24 17:09:39

标签: c database database-design alignment endianness

我正在编写一个玩具数据库管理系统,并且遇到了一些对齐和字节序问题。

首先,请允许我解释正在存储的数据以及存储的位置。首先是一些定义。记录的布局分为记录目录记录数据

[Field count=N] [Field offset[0]] [...] [Field offset[N-1]] [Data for fields 0 to N]
  • 组合的字段数和偏移量称为记录目录。

  • 数据称为记录数据。

  • 字段数是类型 uint16_t

  • 字段偏移属于类型 uint16_t

  • 数据字段可以视为(uint8_t *)指向的长度至少为N字节的可变长度字节缓冲区。

  • 字段数不能超过:4095或0x0FFF(大端)。

记录存储在Page:

  • 页面大小为:4096字节。

  • 页面需要为每条记录存储2个字节的数据。

  • 页面的最后6个字节存储正在运行的可用空间偏移量,以及插槽目录的数据。元数据与问题无关,因此我不会向任何人提供详细信息。

我们将记录存储在页面上,方法是附加到正在运行的可用空间偏移量,然后附加到它上面。以后可以更改和删除记录。这将在页面上留下未使用的空间片段。在压缩之前,这些数据不会被重复使用。

目前,我们在未使用的空间中存储了一个0x80的片段字节(因为可用空间不能超过0x0FFF,第一个字节永远不会是0x80)。

然而,这在压实时间期间成为问题。我们最终扫描所有内容,直到我们达到非0x80的第一个字节。我们认为这是自由空间的开始。不幸的是,这不是便携式的,只适用于大端机器。

但是只是为了重申这个问题,问题是区分:0x8080000x800080,其中前两个字节(从右到左阅读)是两个有效的字段计数字段,具体取决于字节顺序平台。

我想尝试在偶数字节上对齐记录。我只是没有先见之明,看看这是否是这个问题的正确解决方法。

在任何给定时间,自由空间偏移应始终位于偶数字节边界上。这意味着在插入记录后,将可用空间指针前进到下一个偶数边界。

然后问题就变成了标记片段的问题。在删除或更改记录(增长/缩小一定数量的字节)时创建片段。我想存储我称之为2字节片段标记:0xFFFF。但改变时似乎不太可能。

这就是我被困住的地方。对不起,这是一个冗长的问题解释。我们(我的合作伙伴,这是一项学术任务)多次与数据模糊问题作斗争,并且它在不同的解决方案中不断掩盖自己。

任何见解都会有所帮助。我希望可以遵循问题陈述。

1 个答案:

答案 0 :(得分:2)

我会试试这个:

  1. 将记录与至少2个字节的边界对齐。
  2. 将列表中的可用空间扫描为uint16_t而不是char列表, 然后寻找length & 0x8000
  3. 如果让机器解释整数而不是尝试扫描 它们作为字符,字节顺序不应成为问题(至少直到 你想在不同的机器上读取你的数据库 写了)。