2013-06-21 75 views
0

在我的iPhone应用程序的sqlite数据库中,我使用扩展ASCII字符集将长整数数组(最多5位数)编码/压缩成字符串以获取它降低到2个字符。 (换句话说,我使用base150对其进行编码)迭代通过const unsigned char *包含“扩展ASCII”字符

当它从数据库中取出时,sqlite3_column_text()将字符串作为“const unsigned char *”返回。我可以使用printf正确打印此字符串(它甚至可以正确显示超过128的ASCII字符),但是当我尝试遍历它并单独访问字符串的每个字符以将其转换回我的整数时,ASCII值超过128的字符将失败,因为它们是多字节并且只能得到一个字节(我认为)。

例子:

我有这个字符串称为encodedString其中包含:SVO)

unsigned char c = encodedString[0]; 
unsigned char d = encodedString[2]; 

printf("%c", c); //outputs "s" 
printf("%c", d); //outputs "\303" 
printf("%s", encodedString); //outputs "svÖ)" 

我也试着与wchar_t的相同的结果。我已经使用NSStrings工作,但速度很慢,而且我做了这么多次(NSMakeRange是探查器的罪魁祸首),所以我希望它尽可能快,因此C。

从字符串中获取单个多字节/扩展ASCII字符有什么窍门?

+0

使NSString离开它。这是重建它的最简单方法。它不应该那么慢。你如何构建它们?就我所知,ASCII从不是多字节。您所指示的字符似乎并不是ASCII码。它看起来是合并代字符的unicode。 – borrrden

+0

我试图使用扩展的ASCII集,如[这里](http://www.asciitable.com/)所示。 当我做一个for循环从0到255,并将int转换为char时,我的输出匹配该表(我上面的奇怪字符是153)。换句话说,如果我将一个无符号字符硬编码给那个字符,它会保存并正确显示它。只是当它被放入一个字符串中时,我基本上无法将它恢复原样。 我确实使用了NSString,并且使用NSMakeRange来获取单个字符是一个瓶颈。表演是不可接受的。 –

+0

我不明白你会使用NSMakeRange。为什么不直接用'[[NSString alloc] initWithCString:encoding:]'使用'NSISOLatin1StringEncoding'将整个事件变成一个NSString? – borrrden

回答

0

与其使用TEXT列,我建议使用BLOB列,其中数据包含您要使用的任何大小(可能是16位无符号)的整数数组。

您可以使用sqlite_column_bytes()来确定列的大小,从而允许使用可变长度的列。

这将避免您目前面临的复杂性。