保存值非常小的字节数组
Saving byte array with very small values
如果我有两个数字,比如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位数字的数据类型。你可以将其扩展到足以填满内部
这个问题有两个方面:
- 您必须访问位字段的开销-大量的移位和位掩码操作
- 不能以任何类型的数组格式访问数据。指向位字段项的指针是不可能的
其他信息:
要将上述结构写入文件,只需将PackedData变量类型转换为(无符号)int类型,然后将其保存到文件中。当您想读取它时,您可以将读取作为(无符号)int,然后类型转换回PackedData。
不过,需要注意的是,只有当保存和读取数据的系统都使用相同的字节序时,这才有效。否则,数据将被反转。
关于你的问题的另一点,如果你有数字4,你至少需要3位来存储你的数据。
- int占用4字节
- 如果需要2字节无符号整数,则使用WORD(uint16_t)
也许你可以试试short
?short
只从内存中取出一个字节,而不是两个。
在您的程序中,您可以使用if
来决定要写入文件的表单。
if (aNumber > SHRT_MAX || aNumber < SHRT_MIN) write(aNumber);
else write((short)aNumber);
希望这会有所帮助。
相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 基于字节数组生成静态范围整数值
- 将字节数组转换为带有字节序问题的指针
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 swig 追加到字节数组
- C++ 替换字节数组中项的顺序
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 如何通过libpq c api插入字节的数组
- i2c中的字节指针数组
- 以 C++ 为单位递增 16 字节字符数组
- new[] 一个包含构造函数的字节对象数组没有错,对吧?
- 创建未知长度的字节/字符数组
- 我如何将bitset转换为字节/uint8数组
- C++ <--> C# 修改字节编组数组
- 将m个字节的数组拆分为n个字节的块
- c++到c#:有3个元素的字节指针数组等于什么?