objective-c - 将 NSData 字节转换为 NSString

标签 objective-c c cocoa encryption

我正在尝试在 Objective-C (Mac OS) 中创建 16 字节和后来的 32 字节初始化 vector 。我拿了一些关于如何创建随机字节的代码并将其修改为 16 字节,但我对此遇到了一些困难。 NSData 转储十六进制,但 NSString 转储给出 nil,而 cstring NSLog 给出错误的字符数(在此处的转储中不会重现)。

这是我的终端输出:

2012-01-07 14:29:07.705 Test3Test[4633:80f] iv hex <48ea262d efd8f5f5 f8021126 fd74c9fd>
2012-01-07 14:29:07.710 Test3Test[4633:80f] IV string: (null)
2012-01-07 14:29:07.711 Test3Test[4633:80f] IV char string t^Q¶�^��^A

这是主程序:

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    //NSString *iv_string = [NSString stringWithCString:iv encoding:NSUTF8StringEncoding];
    testclass *obj = [testclass alloc];
    NSData *iv_data = [obj createRandomNSData];
    //[iv_string dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"iv hex %@",iv_data);

    //NSString *iv_string = [[NSString alloc] initWithBytes:[iv_data bytes] length:16 encoding:NSUTF8StringE$
    NSString *iv_string = [[NSString alloc] initWithData:iv_data encoding:NSUTF8StringEncoding];
    NSLog(@"IV string: %@",iv_string);
    NSLog(@"IV char string %.*s",[iv_data bytes]);

    return 0;
]

(我在上面留下了一些我尝试过但也不起作用的注释代码)。

下面是我的随机数生成器,取自堆栈溢出示例:

@implementation testclass
-(NSData*)createRandomNSData
{
    int twentyMb           = 16;
    NSMutableData* theData = [NSMutableData dataWithCapacity:twentyMb];
    for( unsigned int i = 0 ; i < twentyMb/4 ; ++i )
    {
            u_int32_t randomBits = arc4random();
            [theData appendBytes:(void*)&randomBits length:4];
    }
    NSData *data = [NSData dataWithData:theData];
    [theData dealloc];
    return data;
}
@end

我真的不知道这里可能出了什么问题。如果我的数据为字节,它应该转换为字符串还是不一定?我已经在 stackoverflow 上查看了相关示例,但没有一个在这种情况下起作用。

谢谢, 以利亚

最佳答案

任意字节序列可能不是合法的 UTF8 编码。正如 @Joachim Isaksson 所指出的,很少有理由以这种方式转换为字符串。如果您需要将随机数据存储为字符串,则应该使用 Base64 等编码方案,将 NSData 序列化为 plist,或类似的方法。您也不能简单地使用 cstring,因为 NULL 在随机字节序列中是合法的,但在 cstring 中是不合法的。

您不需要在 Mac 或 iOS 上构建自己的随机字节创建器。有一个名为 SecRandomCopyBytes() 的内置函数。例如(来自 Properly encrypting with AES with CommonCrypto ):

+ (NSData *)randomDataOfLength:(size_t)length {
  NSMutableData *data = [NSMutableData dataWithLength:length];

  int result = SecRandomCopyBytes(kSecRandomDefault, 
                                  length,
                                  data.mutableBytes);
  NSAssert(result == 0, @"Unable to generate random bytes: %d",
           errno);

  return data;
}

关于objective-c - 将 NSData 字节转换为 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8772620/

相关文章:

c++ - 在混合图形芯片的低功耗端使用 OpenGL

iphone - 我应该为每个标签栏使用单独的 UINavigationController

ios - CoreData - 删除托管对象内的对象

ios - 使用 NSJSONSerialization 从 json 反序列化图像

c - 我无法找到 libftdi 的 mpsse (SPI) 模式的示例代码

c - 如何在我的自定义内核版本中添加新标志

iphone - CoreText 中的行距和段落对齐

ios - 我怎样才能让 tableViewController 知道 managedObjectContext 在外面发生了变化?

iphone - release 与 nil —— 最佳实践

c - 测试 NULL 与字符串指针 x86 与 x64 的长度?