我想用C++实现FAT12规范,其中FAT是一个12位数字的数组。
因为类型只能有完整的字节大小,所以我试着在结构体中使用位域来获得一对两个12位的数字,这将填充3个字节:
struct TwoEntries {
uint16_t first : 12;
uint16_t second : 12;
};
但是由于this question中解释的填充,这个结构体的大小为4个字节,并且使用填充时数组将无法正确地容纳数据。
所以我的问题是:
有没有一些方法可以正确地声明一个12位数字的数组?
2条答案
按热度按时间5cnsuln71#
创建一个压缩字节数组很容易-你可以使用uint8_t的数组(或向量)。棘手的是将该数组中的12位视为12位int,因为没有C++类型表示“12位整数”。
但是,我们可以创建一个近似于12位整数的引用的代理类型:
只要不太仔细看,这就给了你一个看起来像12位整数的类型。它可以隐式地转换为uint16_t,并且可以从uint16_t赋值,这对于大多数用途来说已经足够好了。至于它是否是可移植的,这取决于您在位操作中所做的假设,但这取决于您。
然后我会为你的数组写一个容器类。为了简单起见,我假设数组的大小在构造时已知。
取决于你想做得有多花哨,你可以处理const TwelveBitInts,向容器添加更多的方法,也许是迭代器,等等,但这是基本的想法。
tp5buhyn2#
位字段成员的大小(以字节为单位),它们之间的填充以及其他属性完全是实现定义的,因此当处理像文件系统这样的东西时,它们会成为一个可怕的工具,因为在文件系统中,您必须有一个对所有编译器都相同的布局。
相反,考虑创建一个具有完全控制布局的类:
正如你所看到的,这个方法比使用位字段要多花很多功夫,但是我们可以完全控制内存布局,而且我们的解决方案可以跨不同的编译器移植。
如果你经常遇到这种模式,创建一个类模板可能是有意义的,比如: