我正在尝试将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'
提前致谢, 兰斯
答案 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
。2
迭代第一个(也是唯一的)四个字符,并将它们反向插入一个四字节缓冲区。请记住,characterAtIndex:
返回一个UTF-16字符,但如果它在ASCII范围内,则可以很容易地将其转换为ASCII字符。