2017-04-17 54 views
0

所以我必须为文件页面管理器程序编写以下函数,但我不明白如何处理空终止功能。理解文件页面管理器程序的功能

RC insertRecord(FileHandle &fileHandle, const vector<Attribute> 
&recordDescriptor, const void *data, RID &rid) 

给定一个记录描述符,在由提供的句柄标识的文件中插入一条新记录。你可以假设输入总是正确的并且没有错误。也就是说,您不需要检查 查看输入记录是否具有适当数量的属性或属性类型是否匹配。然而,为了处理属性中的NULL值, ,* data中的第一部分包含传递关于每个字段的空信息的 的n个字节。值n可以通过使用以下公式计算:ceil(记录中的字段数/ 8)。例如,如果有5个字段,则ceil(5/8)= 1 字节。如果有20个字段,大小将为ceil(20/8)= 3个字节。第一个字节 中最左边的位对应于第一个字段。第一个字节中最右边的位对应于第八个字段。如果 有八个以上的字段,则第二个字节中最左边的位对应于第九个字段 依此类推。如果每个字段的相应位设置为1,那么实际数据不包含该字段的任何值 。例如,如果记录中有三个字段,且第二个字段 包含NULL,则字节中的位表示为0100000.此外,在实际数据中,传入记录仅包含第一个和第三个值。也就是说,在这种情况下,第三个字段值是在第一个字段值之后放置的 。

我不明白,所以如果我们有3个属性,那么3/8 = 3个字节,所以前3个字节的数据将对应于null特征;然而,我们如何将这些字节转换为C++中的位,所以我们实际上可以看到空值在哪里?

回答

1

What the instructions describe is a bitmask。记录中的每个字段都由一个位表示。如果该位为1,则该数据不包含该字段的输入。这使您可以确定由data指向的数据的长度。

每个字节通常有8位,所以如果你有9个字段,你将需要9位,这将需要2个字节。 17个字段,17个比特,3个字节等。这是提供的用于计算空信息长度的公式的来源。

所以如果你有3个字段,你需要3/8 = 0.375字节。这需要四舍五入(ceil函数)到最近的整个字节,或者1个字节。