我怎样才能将NSdata转换为hexstring?

我尝试下面的代码转换NSData为hexstring值,但都是错的?

这里“结果”是我的NSdata

我需要一个hexstring作为输出,但我没有得到

NSUInteger dataLength = [result length]; NSLog(@"%d",dataLength); NSMutableString *string = [NSMutableString stringWithCapacity:dataLength*2]; const unsigned char *dataBytes = [result bytes]; for (NSInteger idx = 0; idx < dataLength; ++idx) { [string appendFormat:@"%02x", dataBytes[idx]]; } NSLog(@"%@",string); 

我怎么可以转换这个请

更新:结果数据包含encryptionstring。我想将其转换为hex值

这是我为此做的一个类别。 这只是给你hex数据的所有字符。 没有换行符或任何东西。

 @implementation NSData (NSData_Conversion) #pragma mark - String Conversion - (NSString *)hexadecimalString { /* Returns hexadecimal string of NSData. Empty string if data is empty. */ const unsigned char *dataBuffer = (const unsigned char *)[self bytes]; if (!dataBuffer) { return [NSString string]; } NSUInteger dataLength = [self length]; NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; for (int i = 0; i < dataLength; ++i) { [hexString appendFormat:@"%02x", (unsigned int)dataBuffer[i]]; } return [NSString stringWithString:hexString]; } 

最简单的解决scheme是循环通过NSData的字节,并从中构buildNSString。 使用[你的数据字节]访问字节,并build立一个NSMutableString的string。

这是一个使用NSData类实现的例子

 interface NSData(Hex) -(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces; @end @implementation NSData(Hex) -(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces { const unsigned char* bytes = (const unsigned char*)[self bytes]; NSUInteger nbBytes = [self length]; //If spaces is true, insert a space every this many input bytes (twice this many output characters). static const NSUInteger spaceEveryThisManyBytes = 4UL; //If spaces is true, insert a line-break instead of a space every this many spaces. static const NSUInteger lineBreakEveryThisManySpaces = 4UL; const NSUInteger lineBreakEveryThisManyBytes = spaceEveryThisManyBytes * lineBreakEveryThisManySpaces; NSUInteger strLen = 2*nbBytes + (spaces ? nbBytes/spaceEveryThisManyBytes : 0); NSMutableString* hex = [[NSMutableString alloc] initWithCapacity:strLen]; for(NSUInteger i=0; i<nbBytes; ) { [hex appendFormat:@"%02X", bytes[i]]; //We need to increment here so that the every-n-bytes computations are right. ++i; if (spaces) { if (i % lineBreakEveryThisManyBytes == 0) [hex appendString:@"\n"]; else if (i % spaceEveryThisManyBytes == 0) [hex appendString:@" "]; } } return [hex autorelease]; } @end NSData* data = ... NSString* hex = [data hexRepresentationWithSpaces_AS:YES]; 

Swift 2版本

 private let kHexChars = Array("0123456789abcdef".utf8) as [UInt8]; extension NSData { public func hexString() -> String { guard length > 0 else { return "" } let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(bytes), count: length) var output = [UInt8](count: length*2 + 1, repeatedValue: 0) var i: Int = 0 for b in buffer { let h = Int((b & 0xf0) >> 4) let l = Int(b & 0x0f) output[i++] = kHexChars[h] output[i++] = kHexChars[l] } return String.fromCString(UnsafePointer(output))! } } 

这是整数操作的转换:

 -(NSString*)hex:(NSData*)data{ NSMutableData *result = [NSMutableData dataWithLength:2*data.length]; unsigned const char* src = data.bytes; unsigned char* dst = result.mutableBytes; unsigned char t0, t1; for (int i = 0; i < data.length; i ++ ) { t0 = src[i] >> 4; t1 = src[i] & 0x0F; dst[i*2] = 48 + t0 + (t0 / 10) * 39; dst[i*2+1] = 48 + t1 + (t1 / 10) * 39; } return [[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding]; }