首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用非常小的值保存字节数组

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

Stack Overflow用户
提问于 2015-03-31 13:59:25
回答 3查看 206关注 0票数 0

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

但是,这难道不是浪费空间吗,因为数字太小了,可以用2位和4位来表示吗?

有什么技术可以帮助您在相同的空间中打包更多的数字吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-31 14:05:29

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

代码语言:javascript
复制
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位来存储你的数据。

票数 3
EN

Stack Overflow用户

发布于 2015-03-31 14:04:19

  1. int占4字节
  2. 如果您需要两个字节的无符号整数,那么使用WORD (uint16_t)
票数 -2
EN

Stack Overflow用户

发布于 2015-03-31 14:05:25

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

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

代码语言:javascript
复制
if (aNumber > SHRT_MAX || aNumber < SHRT_MIN) write(aNumber);
else write((short)aNumber);

希望这能帮上忙。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29370378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档