为什么短*而不是char *为字符串? char *和unsigned char *之间的区别?
正如标题所说,我有两个问题。
编辑 :为了澄清,他们实际上并没有使用char
和short
,他们确保它们是特定typedef的8位和16位。 然后将实际类型称为UInt8
和UInt16
。
1.问题
iTunes SDK使用unsigned short*
,需要字符串 。 使用它而不是char*
/ unsigned char*
什么好处? 如何将其转换为char*
,以及使用此类型时有何不同?
2.问题
我只看到char*
当时必须存储一个字符串。 我什么时候应该使用unsigned char*
,或者它没有任何区别?
unsigned short
数组可以与宽字符串一起使用 – 例如,如果你有UTF-16编码文本 – 虽然我希望在这些情况下看到wchar_t
。 但他们可能有他们的理由,比如在MacOS和Windows之间兼容。 (如果我的来源是正确的,MacOS的wchar_t
是32位,而Windows’是16位。)
您可以通过调用相应的库函数在两种类型的字符串之间进行转换。 哪种function合适取决于具体情况。 SDK不附带一个吗?
而且, char
而不是unsigned char
,所有字符串历来总是用char
定义,因此切换到unsigned char
会引入不兼容性。
(切换到signed char
也会导致不兼容,但不知道多少……)
编辑现在问题已被编辑,让我说在输入答案之前我没有看到编辑。 但是,由于上述原因, UInt16
比wchar_t更能代表16位实体。
1.问题 – 答案
我认为他们使用unsigned short *因为他们必须对unicode字符使用UTF-16编码,因此代表BMP内外的字符。 问题的其余部分取决于源和目标的Unicode编码类型(UTF-8,16,32)
2.问题 – 答案
再次取决于编码类型和你在说什么字符串。 如果计划处理扩展ASCII表之外的字符串,则不应使用有符号或无符号字符。 (除英语外的任何其他语言)
-
可能是一个使用UTF-16字符串的harebrained尝试。 C具有宽字符类型
wchar_t
,其char
(或wchar_t
s)可以是16位长。 虽然我对SDK不够熟悉,但是为什么他们确切地说他们经历了这条路线,但它可能会解决编译器问题。 在C99中有更合适的[u] int [least / fast] 16_t类型 – 参见
。请注意,C对数据类型及其基础大小的保证很少。 有符号或无符号短路不保证是16位(尽管它们保证至少那么多),字符也不限于8或16或32的宽带。
要在char和短字符串之间进行转换,您需要使用SDK提供的转换函数。 如果您确切地知道它们存储在那些短字符串中的内容以及您在char字符串中想要的内容,您也可以自己编写或使用第三方库。
-
它并没有真正有所作为。 如果你想对
unsigned char
进行(无符号)算术或位操作,通常会转换为unsigned char
。
编辑:在你告诉我们他们使用了UInt16而不是unsigned short之前,我写了(或者开始写,无论如何)这个答案。 在这种情况下,没有涉及野兔的大脑; 专有类型可能用于与不具有stdint类型的旧(或不符合)编译器兼容,以存储UTF-16数据。 这是完全合理的。