Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 循环遍历常量unsigned char*,其中包含;扩展ASCII“;人物_Ios_Objective C_C_Sqlite - Fatal编程技术网

Ios 循环遍历常量unsigned char*,其中包含;扩展ASCII“;人物

Ios 循环遍历常量unsigned char*,其中包含;扩展ASCII“;人物,ios,objective-c,c,sqlite,Ios,Objective C,C,Sqlite,在我的用于iPhone应用程序的sqlite数据库中,我使用扩展ASCII字符集将一个长整数数组(最多5位)编码/压缩为一个字符串,将其压缩为2个字符。(换句话说,我使用base150对其进行编码) 将其从数据库中取出时,sqlite3_column_text()将字符串作为“const unsigned char*”返回。我可以使用printf正确地打印这个字符串(它甚至可以正确地显示128个以上的ASCII字符),但是当我尝试遍历它并逐个访问字符串的每个字符以转换回整数时,ASCII值超过1

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

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

例如:

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

我也尝试过wchar\t,结果也一样。我已经使用NSStrings让它工作了,但是它非常慢,我已经做了数千次了(根据分析器,NSMakerRange是罪魁祸首),所以我希望它尽可能快,因此C


从字符串中提取单个多字节/扩展ASCII字符的诀窍是什么?

与其使用
TEXT
列,不如使用
BLOB
列,其中数据包含任意大小的整数数组(可能是16位无符号的)

您可以使用
sqlite\u column\u bytes()
来确定列的大小,从而允许使用可变长度的列


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

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

您可以使用
sqlite\u column\u bytes()
来确定列的大小,从而允许使用可变长度的列


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

将其转换为NSString。这是重建它最简单的方法。它不应该那么慢。你是如何构建它们的?据我所知,ASCII从来都不是多字节的。但是,您指示的字符似乎不是ASCII。它看起来是unicode组合波浪形。我正在尝试使用扩展ASCII集,如图所示。当我执行从0到255的for循环,并将int转换为char时,我的输出与该表匹配(上面我奇怪的字符是153)。换句话说,如果我将一个无符号字符硬编码到该字符,它将正确地保存和显示该字符。只是当它被放入一个字符串中时,我基本上无法恢复原来的状态。我确实使用了NSString,而使用NSMakeRange提取单个字符是一个瓶颈。性能不可接受。我不明白你会用NSMakerRange做什么。为什么不使用
[[NSString alloc]initWithCString:encoding:][/code>使用
NSISOLatin1StringEncoding
立即将整个内容制作成一个NSString?另外,如果您只使用2个字符,那么如何使用
无符号字符d=encodedString[2]?您不能,因为它们不是您期望的字符,而且不再是单字节字符。您期望的是'153'(0x99),但您将得到的是'195150'(0xC3 0x96)。这就是为什么我说你需要展示你是如何使这个字符串值。我怀疑你所做的事是否正确。扩展ASCII远远不是标准的。用它生成一个NSString。这是重建它最简单的方法。它不应该那么慢。你是如何构建它们的?据我所知,ASCII从来都不是多字节的。但是,您指示的字符似乎不是ASCII。它看起来是unicode组合波浪形。我正在尝试使用扩展ASCII集,如图所示。当我执行从0到255的for循环,并将int转换为char时,我的输出与该表匹配(上面我奇怪的字符是153)。换句话说,如果我将一个无符号字符硬编码到该字符,它将正确地保存和显示该字符。只是当它被放入一个字符串中时,我基本上无法恢复原来的状态。我确实使用了NSString,而使用NSMakeRange提取单个字符是一个瓶颈。性能不可接受。我不明白你会用NSMakerRange做什么。为什么不使用
[[NSString alloc]initWithCString:encoding:][/code>使用
NSISOLatin1StringEncoding
立即将整个内容制作成一个NSString?另外,如果您只使用2个字符,那么如何使用
无符号字符d=encodedString[2]?您不能,因为它们不是您期望的字符,而且不再是单字节字符。您期望的是'153'(0x99),但您将得到的是'195150'(0xC3 0x96)。这就是为什么我说你需要展示你是如何使这个字符串值。我怀疑你所做的事是否正确。扩展ASCII远远不是标准。
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Ö)"