【问题标题】:How to convert an NSString to char如何将 NSString 转换为 char
【发布时间】:2011-04-17 08:34:57
【问题描述】:

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

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

我想我可以使用[aString getCharacters:range:],但有没有更直接的方法来进行这种转换?

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

我正在使用 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'

提前致谢, 兰斯

【问题讨论】:

    标签: objective-c nsstring char


    【解决方案1】:

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

    *(ResType*)[aString UTF8String] 会将字符串转换为 UTF-8(只要字符串中的所有字符都在 ASCII 范围内,就相当于 ASCII),然后将前四个字节作为ResType 值提供给您。这是否足够有效取决于您希望多久进行一次这些转换。

    另一个选项是使用getBytes:maxLength:usedLength:encoding:options:range:remainingRange:,编码设置为NSASCIIStringEncodingNSUTF8StringEncoding,目标缓冲区设置为指向现有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。因此,如果您想将 NSStrings 转换为这些值,这里有几个选项:

    • 将字符串复制到一个四字节缓冲区(使用我建议的方法之一),然后将字节 0 与字节 3 交换,并将字节 1 与字节 2 交换来反转它。李>
    • 相同,但使用标准“字节顺序交换”算法(如 this page 中的算法)进行反转。
    • 使用characterAtIndex: 遍历第一个(也是唯一的)四个字符,并将它们反向插入一个四字节缓冲区。请记住,characterAtIndex: 返回一个 UTF-16 字符,但如果它在 ASCII 范围内,则可以轻松地将其转换为 ASCII 字符。

    【讨论】:

    • 感谢您的快速回复。然而,这些方法对我不起作用。我将在我原来的问题中添加更多信息。
    • @Lance:我已经找出问题所在,并用一些建议更新了我的答案。
    • @David:如果我需要交换字节顺序,我会使用内置的 Cocoa 函数来做这件事,比如NXByteSwap...()。这样,当 Apple 再次更新他们的架构时(他们最近有过四次),结果仍然可能是正确的。
    • @Graham:好主意。为了 OP 的利益,您能否发布函数的全名或文档链接?我会自己做,但由于某种原因我找不到。
    • @David/@Lance: Core Endian 中的EndianU32_NtoB() 是进行转换的众多 API 之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2012-02-29
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多