1

我有一个介于 0 和 3 之间的很长的数字链。我想知道如何保存它,以便它使用尽可能少的磁盘空间。我一直在考虑它,我注意到从 0 到 3 的数字也可以是两个二进制数字,因此将其保存为二进制可能是个好主意。

我还想将其保存为自定义文件类型,以使我的应用程序成为读取它的唯一应用程序,但这不是必需的(但是,我们将不胜感激)。

我也发现了这个问题,这可能很有用,但我还没有找到方法:

但我找不到任何关于如何在 iOS 上创建自定义文件类型的问题或博客或其他内容,只有关于如何将其与应用程序关联的问题。

如果您需要更多信息,请问我!

提前致谢!!!

编辑:

链大概有几百,我想应该会小于1000。真的,我想要实现的是保存一个发明的DNA数据,DNA碱基是A,G,C和T,可以转换为 0、1、2、3;但如果我将其保存为文本文件,它会大得多。我唯一要做的就是计算互补碱基 (G > C, C > G, A > T, T > A)。

再次感谢您的关注!!

4

2 回答 2

3

我在你的个人资料上看到你 15 岁,所以我假设你这样做是为了好玩和学习。如果您要专业地执行此操作,您可能希望使用标准的csv 格式,因为它是最快和最容易实现的东西。由于您处理的值少于一千个,因此文件永远不会大于 2 KB,相比之下,这没什么。您的应用程序文件可能会大数千倍。

示例文件格式:

0,1,2,3,2,1,3,0

甚至

A,G,C,T,C,G,T,A

如果您只是为了好玩或学习而不收取 100 美元/小时的费用,我会选择 2 位值的二进制格式。这有点挑战,做起来可能很有趣。但是,对于付费客户来说,额外的时间永远不值得。它对应用程序性能和内存使用的影响极低,而且您每多花一小时就会为客户多花 100 美元。

当然,如果您要处理数十亿个值,那么这种优化是有意义的,但是对于数百个值,不值得付出额外的努力。

于 2012-06-19T21:33:32.503 回答
0

这应该让您了解如何将 4 个 2 位值打包到单个字符中。我宁愿阅读 CSV 数据而不是这个,但你应该知道如何打包它。

或者,使用您手头的压缩库(ZLib 等)来输出压缩流。或者压缩我们在这里创建的比特流以获得更小的占用空间。

 // Given sourceArray as an array of ASCII chars containing '0' through '3'
unsigned char accumulator = 0;

for(i=0; i<numBytesInSourceArray; i++)
{
    int value = sourceArray[i] - '0';
    assert(value >= 0 && value <= 3);

    int shift = (i & 0x03) * 2;
    accumulator |= (value  - '0') << shift;

    if(shift == 6)    
    {
        outputByte(accumulator);
        accumulator = 0;
    }
}

if(numBytesInSource & 0x03)
{
    outputByte(accumulator);
}
于 2012-06-19T22:03:45.577 回答