objective-c - 如何使用 NSString getBytes :maxLength:usedLength:encoding:options:range:remainingRange:

标签 objective-c cocoa character-encoding nsstring

我有一个字符串,我想将其作为字节数组。到目前为止,我已经使用 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'ed - 但我不确定如何找到 malloc 的内存量。我知道有 [NSString lengthOfBytesUsingEncoding:][NSString maximumLengthOfBytesUsingEncoding:] 但我不知道这些是否是我需要使用的方法并且不完全理解它们之间的区别。我假设这与赋予 maxLength 的值相同。其余参数在文档中有意义。任何帮助都会很棒。谢谢。

最佳答案

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);

关于objective-c - 如何使用 NSString getBytes :maxLength:usedLength:encoding:options:range:remainingRange:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8019647/

相关文章:

objective-c - 如何使用图像管理内存

macos - 从帮助菜单中删除(或自定义) 'Search'

cocoa - 停止 NSFileManager 进程

macos - 在 NSTableView OS X 中显示 rowActions

c++ - 如何将字符串从 C# 传递到 C++ 并指定编码

ios - Apple receipt_data 示例

ios - 如何使用这个格式化程序?

objective-c - Apple 的 BetterAuthorizationSample 在 10.6.6 上不起作用

java - 如何通过规范化信件格式来过滤聊天消息?

validation - 我真的需要将 '&' 编码为 '&' 吗?