保存值非常小的字节数组
Saving byte array with very small values
如果我有两个数字,比方说 4 和 2,我想将它们保存到一个文件中。两者都是 int
类型,所以它们每个应该占用 4 个字节。
但是这不是浪费space吗,因为数字太小了,只用 2 位和 4 位就可以表示?
是否有任何技术可以帮助您将更多数字打包成相同的 space?
- int占用4字节
- 如果您需要 2 字节无符号整数,则使用 WORD (uint16_t)
也许你可以试试 short
? short
只从内存中取出一个字节而不是两个。
在您的程序中,您可以使用 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。
这有两个问题:
- 您必须承担访问位域的开销 - 大量移位和
位掩码操作。
- 您无法访问任何数组格式的数据。指向位域条目的指针是不可能的。
附加信息:
要将上述结构写入文件,您只需将 PackedData 变量类型转换为(无符号)int 类型,然后将其保存到文件。当你想读取它时,你将读取作为(无符号)int,然后类型转换回 PackedData。
不过请注意,这仅在保存和读取数据的系统都使用相同字节顺序的情况下才有效。否则数据将被反转。
关于你的问题的另外一点,如果你有数字4,你至少需要3位来存储你的数据。
如果我有两个数字,比方说 4 和 2,我想将它们保存到一个文件中。两者都是 int
类型,所以它们每个应该占用 4 个字节。
但是这不是浪费space吗,因为数字太小了,只用 2 位和 4 位就可以表示?
是否有任何技术可以帮助您将更多数字打包成相同的 space?
- int占用4字节
- 如果您需要 2 字节无符号整数,则使用 WORD (uint16_t)
也许你可以试试 short
? short
只从内存中取出一个字节而不是两个。
在您的程序中,您可以使用 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。
这有两个问题:
- 您必须承担访问位域的开销 - 大量移位和 位掩码操作。
- 您无法访问任何数组格式的数据。指向位域条目的指针是不可能的。
附加信息:
要将上述结构写入文件,您只需将 PackedData 变量类型转换为(无符号)int 类型,然后将其保存到文件。当你想读取它时,你将读取作为(无符号)int,然后类型转换回 PackedData。
不过请注意,这仅在保存和读取数据的系统都使用相同字节顺序的情况下才有效。否则数据将被反转。
关于你的问题的另外一点,如果你有数字4,你至少需要3位来存储你的数据。