保存值非常小的字节数组

Saving byte array with very small values

本文关键字:字节 字节数 数组 非常 保存      更新时间:2023-10-16

如果我有两个数字,比如4和2,我想保存到一个文件中。两者都属于int类型,因此它们应该各占用4个字节。

但这不是在浪费空间吗?因为数字太小了,而且只能用2和4位来表示?

有什么技术可以帮助你在同一个空间里封装更多的数字吗?

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

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位数字的数据类型。你可以将其扩展到足以填满内部

这个问题有两个方面:

  1. 您必须访问位字段的开销-大量的移位和位掩码操作
  2. 不能以任何类型的数组格式访问数据。指向位字段项的指针是不可能的

其他信息:

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

不过,需要注意的是,只有当保存和读取数据的系统都使用相同的字节序时,这才有效。否则,数据将被反转。


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

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

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

在您的程序中,您可以使用if来决定要写入文件的表单。

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

希望这会有所帮助。