保存值非常小的字节数组

Saving byte array with very small values

如果我有两个数字,比方说 4 和 2,我想将它们保存到一个文件中。两者都是 int 类型,所以它们每个应该占用 4 个字节。

但是这不是浪费space吗,因为数字太小了,只用 2 位和 4 位就可以表示?

是否有任何技术可以帮助您将更多数字打包成相同的 space?

  1. int占用4字节
  2. 如果您需要 2 字节无符号整数,则使用 WORD (uint16_t)

也许你可以试试 shortshort 只从内存中取出一个字节而不是两个。

在您的程序中,您可以使用 if 来决定要将哪种形式写入文件。

if (aNumber > SHRT_MAX || aNumber < SHRT_MIN) write(aNumber);
else write((short)aNumber);

希望这会有所帮助。

可以使用位域来做到这一点,这将允许您创建更紧凑的数据。 例如:

typedef struct {
   unsigned int first:3;
   unsigned int second:3;
   unsigned int third:3; //and so on
} PackedData;
...
PackedData a;
a.first = 4;
a.second = 2;

这将创建一个具有三个 3 位数字的数据类型。您可以将其扩展到足以填满 int。

这有两个问题:

  1. 您必须承担访问位域的开销 - 大量移位和 位掩码操作。
  2. 您无法访问任何数组格式的数据。指向位域条目的指针是不可能的。

附加信息:

要将上述结构写入文件,您只需将 PackedData 变量类型转换为(无符号)int 类型,然后将其保存到文件。当你想读取它时,你将读取作为(无符号)int,然后类型转换回 PackedData。

不过请注意,这仅在保存和读取数据的系统都使用相同字节顺序的情况下才有效。否则数据将被反转。


关于你的问题的另外一点,如果你有数字4,你至少需要3位来存储你的数据。