我正在编写一个玩具数据库管理系统,并且遇到了一些对齐和字节序问题。
首先,请允许我解释正在存储的数据以及存储的位置。首先是一些定义。记录的布局分为记录目录和记录数据。
[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的第一个字节。我们认为这是自由空间的开始。不幸的是,这不是便携式的,只适用于大端机器。
但是只是为了重申这个问题,问题是区分:0x808000
和0x800080
,其中前两个字节(从右到左阅读)是两个有效的字段计数字段,具体取决于字节顺序平台。
我想尝试在偶数字节上对齐记录。我只是没有先见之明,看看这是否是这个问题的正确解决方法。
在任何给定时间,自由空间偏移应始终位于偶数字节边界上。这意味着在插入记录后,将可用空间指针前进到下一个偶数边界。
然后问题就变成了标记片段的问题。在删除或更改记录(增长/缩小一定数量的字节)时创建片段。我想存储我称之为2字节片段标记:0xFFFF。但改变时似乎不太可能。
这就是我被困住的地方。对不起,这是一个冗长的问题解释。我们(我的合作伙伴,这是一项学术任务)多次与数据模糊问题作斗争,并且它在不同的解决方案中不断掩盖自己。
任何见解都会有所帮助。我希望可以遵循问题陈述。
答案 0 :(得分:2)
我会试试这个:
length & 0x8000
。如果让机器解释整数而不是尝试扫描 它们作为字符,字节顺序不应成为问题(至少直到 你想在不同的机器上读取你的数据库 写了)。