【问题标题】:How to use NSString getBytes:maxLength:usedLength:encoding:options:range:remainingRange:如何使用 NSString getBytes:maxLength:usedLength:encoding:options:range:remainingRange:
【发布时间】:2011-12-22 14:36:48
【问题描述】:

我有一个我想要作为字节数组的字符串。到目前为止,我已经使用 NSData 来做到这一点:

NSString *message = @"testing";
NSData *messageData = [message dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:YES];
NSUInteger dataLength = [messageData length];
Byte *byteData = (Byte*)malloc( dataLength );
memcpy( byteData, [messageData bytes], dataLength );

但是,我知道 NSString 有 getBytes:maxLength:usedLength:encoding:options:range:remainingRange: 方法,可以让我跳过一起使用 NSData。我的问题是,我不知道如何正确设置所有参数。

我假设传入的指针数组必须是 malloc 的 - 但我不确定如何找到 malloc 的内存量。我知道有[NSString lengthOfBytesUsingEncoding:][NSString maximumLengthOfBytesUsingEncoding:] 但我不知道这些是否是我需要使用的方法并且不完全理解它们之间的区别。我假设这将与maxLength 的值相同。其余参数在文档中是有意义的。任何帮助都会很棒。谢谢。

【问题讨论】:

    标签: objective-c cocoa character-encoding nsstring


    【解决方案1】:

    lengthOfBytesUsingEncoding:maximumLengthOfBytesUsingEncoding: 之间的区别在于前者精确但慢 (O(n)),而后者速度快 (O(1)) 但可能返回比实际更多的字节数需要。 maximumLengthOfBytesUsingEncoding: 提供的唯一保证是返回值将足够大以包含字符串的字节。

    一般来说,您的假设是正确的。所以方法应该这样使用:

    NSUInteger numberOfBytes = [message lengthOfBytesUsingEncoding:NSUnicodeStringEncoding];
    void *buffer = malloc(numberOfBytes);
    NSUInteger usedLength = 0;
    NSRange range = NSMakeRange(0, [message length]);
    BOOL result = [message getBytes:buffer maxLength:numberOfBytes usedLength:&usedLength encoding:NSUnicodeStringEncoding options:0 range:range remainingRange:NULL];
    ...
    free(buffer);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多