将NSData字节转换为NSString

use*_*069 2 c encryption cocoa objective-c

我试图在objective-c(Mac OS)中创建一个16字节和更晚的32字节初始化向量.我拿了一些关于如何创建随机字节并将其修改为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
Run Code Online (Sandbox Code Playgroud)

这是主要计划:

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;
]
Run Code Online (Sandbox Code Playgroud)

(我在上面留下了一些我尝试过但也没有用的评论代码).

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

@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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,以利亚

Rob*_*ier 7

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

您无需在Mac或iOS上构建自己的随机字节创建器.有一个内置叫SecRandomCopyBytes().例如(使用带有CommonCrypto的AES正确加密):

+ (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;
}
Run Code Online (Sandbox Code Playgroud)