我的算法产生 9 位和 17 位的流,我需要找到将这些数据存储在文件中的解决方案。但我不能只将 9 位存储为 int,将 17 位存储为 int_32。
例如,如果我的算法产生 10x9 位和 5x17 位,则输出文件大小需要为 22 字节。
还有一个要解决的大问题是输出文件可能非常大并且文件的大小是未知的。
我现在唯一的想法是使用 bool *vector;
我的算法产生 9 位和 17 位的流,我需要找到将这些数据存储在文件中的解决方案。但我不能只将 9 位存储为 int,将 17 位存储为 int_32。
例如,如果我的算法产生 10x9 位和 5x17 位,则输出文件大小需要为 22 字节。
还有一个要解决的大问题是输出文件可能非常大并且文件的大小是未知的。
我现在唯一的想法是使用 bool *vector;
如果您必须保存动态位,那么您可能应该保存两个值:第一个是位数(如果位从 0 到 x 是连续的),或者是表示哪些位有效的位掩码;第二个是代表您的位的 32 位整数。
从字面上看你的例子:如果你想存储 175 位并且它由两个不同长度的未知数量的实体组成,那么文件绝对不能只有 22 个字节。您需要知道文件中前面的内容,您需要长度。如果你只有两种可能的尺寸,那么它只能是一个位。0 表示 9 位,1 表示 17 位。
|0|9bit|0|9bit|1|17bit|0|9bit|1|17bit|1|17bit|...
因此,对于您的示例,您需要 10*(1+9)+5*(1+17) = 190 位 ~ 24 字节。突出的 2 位需要用 0 填充,以便在字节边界对齐。您将继续读取文件,就好像有另一个实体一样(因为您说您不知道文件有多长)这一事实不应该成为问题,因为最后一个这样的填充将始终小于 9 位。到达文件末尾后,您可以丢弃最后一次不完整的阅读。
这种方法确实需要实现字节级流的位级操作。这意味着仔细的屏蔽和逻辑操作。BASE64 就是这样,只是比你更简单,只包含固定的 6 位实体,存储在文本文件中。