迭代包含“扩展ASCII”字符的const unsigned char *

时间:2013-06-21 01:25:10

标签: ios objective-c c sqlite

在我的iPhone应用程序的sqlite数据库中,我使用扩展的ASCII字符集将一长串整数(最多5位数)编码/压缩成一个字符串,使其低至2个字符。 (换句话说,我使用base150对其进行编码)

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

示例:

我有一个名为encodedString的字符串,其中包含:svÖ)

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. / p>

从字符串中获取单个多字节/扩展ASCII字符的技巧是什么?

1 个答案:

答案 0 :(得分:0)

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

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

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