使用非常小的值保存字节数组

时间:2015-03-31 13:59:26

标签: c++ bytearray

如果我有两个数字,让我们说4和2,我想保存到文件中。两者都是int类型,因此它们每个应占用4个字节。

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

是否有任何技术可以帮助您在同一空间内打包更多数字?

3 个答案:

答案 0 :(得分:3)

可以使用位字段来实现,这将允许您创建更紧凑的数据。 例如:

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. 您无法以任何类型的数组格式访问数据。指向位域条目的指针是不可能的。

  3. 其他信息:

    要将上述结构写入文件,只需将PackedData变量强制转换为(unsigned)int类型,然后将其保存到文件中即可。如果要读取它,则将读取作为(unsigned)int,然后将类型转换回PackedData。

    但请注意,这仅适用于保存和读取数据的系统都使用相同的字节顺序的情况。否则数据将被反转。


    问题的另一点,如果您的号码为4,则至少需要3位来存储您的数据。

答案 1 :(得分:-2)

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

答案 2 :(得分:-3)

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

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

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

希望这会有所帮助。