在iPhone上保存从0到3的数字长链(NSArray),有效的方式

Posted

技术标签:

【中文标题】在iPhone上保存从0到3的数字长链(NSArray),有效的方式【英文标题】:Save long chain (NSArray) of numbers from 0 to 3 on iPhone, efficient way 【发布时间】:2012-06-19 19:23:02 【问题描述】:

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

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

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

iPhone writing binary data Associate filetype to iPhone app

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

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

提前致谢!!!

编辑:

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

再次感谢您的关注!!

【问题讨论】:

多长时间?我们是在谈论数百、数千、数百万吗?对数字进行位打包(每个数字 2 位)将消耗最少的磁盘空间,但算法会更难调试。另外,您对这些数字字符串进行了哪些计算?您不需要 Windows/MacOS 意义上的“自定义文件类型”。只要想出一个格式,然后为它写一个解析器/序列化器。 我假设你在谈论整数?打包 2 位值有什么问题?这可以在前面加上一个计数值来指示数组的长度。 我将编辑我的问题以回答两个 cmets,并提供更多信息 数百根本不是什么大问题。您真的可以为此使用任何方法,而无需担心内存。 将它们存储为 4 字节整数可能太多了 :) 每种基本格式使用一个字节。您甚至可以使用 ASCII 字符 AGCT。并使用 NSString 进行内存表示。 【参考方案1】:

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

示例文件格式:

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

甚至

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

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

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

【讨论】:

你说得对,我这样做是出于爱好,当然也是为了学习。我认为 .csv 格式是我需要的,我可以简单地更改文件扩展名来创建一个只有我的应用程序才能识别的文件。很好的答案。谢谢! @Asterix22,仅供参考,在 UNIX 系统上,文件扩展名并不重要。无论您选择什么文件扩展名,任何文本编辑器都可以打开它。但是,您不必担心,iOS 应用程序是沙盒的,无法访问彼此的数据。如果您正在处理敏感数据,则应该对其进行加密。更改文件扩展名根本不会保护它,只会更容易识别文件格式。因此,请务必使用自定义文件扩展名,但不要期望这样做会增加任何安全性。 是的,这不是为了安全,我只想要我的应用程序可以识别的文件格式,因为我还想通过电子邮件发送这些数据,所以更容易。但我已经找到了方法。【参考方案2】:

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

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

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

for(i=0; i&ltnumBytesInSourceArray; i++)

    int value = sourceArray[i] - '0';
    assert(value >= 0 && value &lt= 3);

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

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


if(numBytesInSource & 0x03)

    outputByte(accumulator);

【讨论】:

以上是关于在iPhone上保存从0到3的数字长链(NSArray),有效的方式的主要内容,如果未能解决你的问题,请参考以下文章

NSUserDefaults:保存的数字始终为 0,iPhone

iPhonex从安卓转移到iOS失败无法链接怎么办?

iPhone:如何从Objective-C中的货币符号字符串中获取数字

从 iPhone 向网站发送数据

将 .txt 文件从 ftp 保存到文档文件夹 iphone

无法将数据保存到 iPhone 上的文件