如何将NSString转换为char

时间:2010-09-26 08:06:39

标签: objective-c nsstring char

我正在尝试将NSString转换为ResType,如MacTypes.h中所定义。

FourCharCode // A 32-bit value made by packing four 1 byte characters together
typedef FourCharCode ResType;

我想我可以使用[aString getCharacters:range:],但有更直接的方式进行转换吗?

在尝试了大卫的建议之后,这里有一些进一步的信息。

我正在使用GTResourceFork,一个用于访问资源分支的Cocoa包装器。我打电话的方法是:      - (NSArray *)usedResourcesOfType:(ResType)type;

如果我硬编码'RTF'的值,我会得到我期望的结果。我无法弄清楚如何将包含“RTF”的NSString转换为硬编码值。我使用NSString的getCharacters和getBytes创建了一个测试用例,它们都给了我不同的整数值。如何转换NSString以获得与硬编码相同的整数值?

 Method used:       Value:  Casted int value:
 Hard Coded(Works): 'RTF ' '1381254688'
 getCharacters:     'RTF ' '5505106'
 getBytes(ASCII):   'RTF ' '541480018'
 getBytes(UTF8):    'RTF ' '541480018'

提前致谢, 兰斯

1 个答案:

答案 0 :(得分:1)

getCharacters:range:的问题在于它为您提供了UTF-16字符(unichar s),而您需要ASCII。

*(ResType*)[aString UTF8String]会将字符串转换为UTF-8(只要字符串中的所有字符都符合ASCII范围,就等于ASCII),然后将前四个字节作为{{1价值。这是否足够有效取决于您希望进行这些转换的频率。

另一种选择是使用ResType,编码设置为getBytes:maxLength:usedLength:encoding:options:range:remainingRange:NSASCIIStringEncoding,目标缓冲区设置为指向现有NSUTF8StringEncoding变量的指针,最大值长度设置为ResType(或4)。


更新

我已经弄清楚为什么你的建议没有得到正确的结果。事实证明,在四字符整数文字中,字节的存储顺序与它们的写入顺序相反。这是一个例子:

sizeof (ResType)

输出为#include <Foundation/Foundation.h> int main() { int code = 'RTF '; printf("'%c%c%c%c' = %d\n", ((char*)&code)[0], ((char*)&code)[1], ((char*)&code)[2], ((char*)&code)[3], code); } 。因此,如果您想将' FTR' = 1381254688 s转换为这些值,可以选择以下几个选项:

  • 将字符串复制到一个四字节缓冲区(使用我建议的方法之一),然后通过交换带有字节NSString的字节0和带字节的字节3来反转它1
  • 同样,但使用标准的“endianness-swapping”算法进行反转,例如this page上的算法。
  • 使用2迭代第一个(也是唯一的)四个字符,并将它们反向插入一个四字节缓冲区。请记住,characterAtIndex:返回一个UTF-16字符,但如果它在ASCII范围内,则可以很容易地将其转换为ASCII字符。