如何将NSData转换为NSString十六进制字符串?

如何将NSData转换为NSString十六进制字符串?

当我调用-description一个NSData对象时,我看到一个NSData对象字节的十六进制字符串,如:

<f6e7cd28 0fc5b5d4 88f8394b af216506 bc1bba86 4d5b483d>

我希望将数据的这种表示(减去lt / gt引号)放入内存中,NSString这样我就可以使用它。我不想调用-[NSData description]然后只修剪lt / gt引号(因为我认为这不是NSData公共界面的保证方面,并且将来会发生变化。

NSData对象表示为NSString对象(除了调用之外-description)的最简单方法是什么?


www说
浏览 1276回答 3
3回答

繁星点点滴滴

请记住,任何String(format: ...)解决方案都会非常慢(对于大数据)NSData&nbsp;*data&nbsp;=&nbsp;...;NSUInteger&nbsp;capacity&nbsp;=&nbsp;data.length&nbsp;*&nbsp;2;NSMutableString&nbsp;*sbuf&nbsp;=&nbsp;[NSMutableString&nbsp;stringWithCapacity:capacity];const&nbsp;unsigned&nbsp;char&nbsp;*buf&nbsp;=&nbsp;data.bytes;NSInteger&nbsp;i;for&nbsp;(i=0;&nbsp;i<data.length;&nbsp;++i)&nbsp;{ &nbsp;&nbsp;[sbuf&nbsp;appendFormat:@"%02X",&nbsp;(NSUInteger)buf[i]];}如果你需要更高性能的东西试试这个:static&nbsp;inline&nbsp;char&nbsp;itoh(int&nbsp;i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;>&nbsp;9)&nbsp;return&nbsp;'A'&nbsp;+&nbsp;(i&nbsp;-&nbsp;10); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'0'&nbsp;+&nbsp;i;}NSString&nbsp;*&nbsp;NSDataToHex(NSData&nbsp;*data)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;NSUInteger&nbsp;i,&nbsp;len; &nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;*buf,&nbsp;*bytes; &nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;data.length; &nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;=&nbsp;(unsigned&nbsp;char*)data.bytes; &nbsp;&nbsp;&nbsp;&nbsp;buf&nbsp;=&nbsp;malloc(len*2); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i<len;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[i*2]&nbsp;=&nbsp;itoh((bytes[i]&nbsp;>>&nbsp;4)&nbsp;&&nbsp;0xF); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[i*2+1]&nbsp;=&nbsp;itoh(bytes[i]&nbsp;&&nbsp;0xF); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[[NSString&nbsp;alloc]&nbsp;initWithBytesNoCopy:buf &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length:len*2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoding:NSASCIIStringEncoding &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeWhenDone:YES];}Swift 4.2版本extension&nbsp;Data&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;hexString:&nbsp;String?&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;withUnsafeBytes&nbsp;{&nbsp;(bytes:&nbsp;UnsafePointer<UInt8>)&nbsp;in &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;charA&nbsp;=&nbsp;UInt8(UnicodeScalar("a").value) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;char0&nbsp;=&nbsp;UInt8(UnicodeScalar("0").value) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;itoh(_&nbsp;value:&nbsp;UInt8)&nbsp;->&nbsp;UInt8&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(value&nbsp;>&nbsp;9)&nbsp;?&nbsp;(charA&nbsp;+&nbsp;value&nbsp;-&nbsp;10)&nbsp;:&nbsp;(char0&nbsp;+&nbsp;value) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;hexLen&nbsp;=&nbsp;count&nbsp;*&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ptr&nbsp;=&nbsp;UnsafeMutablePointer<UInt8>.allocate(capacity:&nbsp;hexLen) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;0&nbsp;..<&nbsp;count&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr[i*2]&nbsp;=&nbsp;itoh((bytes[i]&nbsp;>>&nbsp;4)&nbsp;&&nbsp;0xF) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr[i*2+1]&nbsp;=&nbsp;itoh(bytes[i]&nbsp;&&nbsp;0xF) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;String(bytesNoCopy:&nbsp;ptr, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length:&nbsp;hexLen, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoding:&nbsp;.utf8, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeWhenDone:&nbsp;true) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}

哔哔one

我同意解决方案不要调用description哪个是保留用于调试,所以好点和好问题:)最简单的解决方案是循环遍历字节NSData并从中构造NSString。使用[yourData bytes]访问字节,并建立串入一个NSMutableString。以下是使用NSData类别实现此示例的示例@interface&nbsp;NSData(Hex)-(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces;@end@implementation&nbsp;NSData(Hex)-(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces{ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;unsigned&nbsp;char*&nbsp;bytes&nbsp;=&nbsp;(const&nbsp;unsigned&nbsp;char*)[self&nbsp;bytes]; &nbsp;&nbsp;&nbsp;&nbsp;NSUInteger&nbsp;nbBytes&nbsp;=&nbsp;[self&nbsp;length]; &nbsp;&nbsp;&nbsp;&nbsp;//If&nbsp;spaces&nbsp;is&nbsp;true,&nbsp;insert&nbsp;a&nbsp;space&nbsp;every&nbsp;this&nbsp;many&nbsp;input&nbsp;bytes&nbsp;(twice&nbsp;this&nbsp;many&nbsp;output&nbsp;characters). &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;const&nbsp;NSUInteger&nbsp;spaceEveryThisManyBytes&nbsp;=&nbsp;4UL; &nbsp;&nbsp;&nbsp;&nbsp;//If&nbsp;spaces&nbsp;is&nbsp;true,&nbsp;insert&nbsp;a&nbsp;line-break&nbsp;instead&nbsp;of&nbsp;a&nbsp;space&nbsp;every&nbsp;this&nbsp;many&nbsp;spaces. &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;const&nbsp;NSUInteger&nbsp;lineBreakEveryThisManySpaces&nbsp;=&nbsp;4UL; &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;NSUInteger&nbsp;lineBreakEveryThisManyBytes&nbsp;=&nbsp;spaceEveryThisManyBytes&nbsp;*&nbsp;lineBreakEveryThisManySpaces; &nbsp;&nbsp;&nbsp;&nbsp;NSUInteger&nbsp;strLen&nbsp;=&nbsp;2*nbBytes&nbsp;+&nbsp;(spaces&nbsp;?&nbsp;nbBytes/spaceEveryThisManyBytes&nbsp;:&nbsp;0); &nbsp;&nbsp;&nbsp;&nbsp;NSMutableString*&nbsp;hex&nbsp;=&nbsp;[[NSMutableString&nbsp;alloc]&nbsp;initWithCapacity:strLen]; &nbsp;&nbsp;&nbsp;&nbsp;for(NSUInteger&nbsp;i=0;&nbsp;i<nbBytes;&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[hex&nbsp;appendFormat:@"%02X",&nbsp;bytes[i]]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//We&nbsp;need&nbsp;to&nbsp;increment&nbsp;here&nbsp;so&nbsp;that&nbsp;the&nbsp;every-n-bytes&nbsp;computations&nbsp;are&nbsp;right. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++i; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(spaces)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;%&nbsp;lineBreakEveryThisManyBytes&nbsp;==&nbsp;0)&nbsp;[hex&nbsp;appendString:@"\n"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(i&nbsp;%&nbsp;spaceEveryThisManyBytes&nbsp;==&nbsp;0)&nbsp;[hex&nbsp;appendString:@"&nbsp;"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[hex&nbsp;autorelease];}@end用法:NSData*&nbsp;data&nbsp;=&nbsp;...NSString*&nbsp;hex&nbsp;=&nbsp;[data&nbsp;hexRepresentationWithSpaces_AS:YES];
打开App,查看更多内容
随时随地看视频慕课网APP