我正在寻找一种很好的 cocoa 方法来将 NSData 对象序列化为十六进制字符串。这个想法是在将用于通知的 deviceToken 发送到我的服务器之前对其进行序列化。
我有以下实现,但我认为必须有一些更短、更好的方法来实现它。
+ (NSString*) serializeDeviceToken:(NSData*) deviceToken
{
NSMutableString *str = [NSMutableString stringWithCapacity:64];
int length = [deviceToken length];
char *bytes = malloc(sizeof(char) * length);
[deviceToken getBytes:bytes length:length];
for (int i = 0; i < length; i++)
{
[str appendFormat:@"%02.2hhX", bytes[i]];
}
free(bytes);
return str;
}
最佳答案
这是我编写的应用于 NSData 的类别。它返回一个表示 NSData 的十六进制 NSString,其中数据可以是任意长度。如果 NSData 为空,则返回空字符串。
NSData+Conversion.h
#import <Foundation/Foundation.h>
@interface NSData (NSData_Conversion)
#pragma mark - String Conversion
- (NSString *)hexadecimalString;
@end
NSData+Conversion.m
#import "NSData+Conversion.h"
@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 appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]];
return [NSString stringWithString:hexString];
}
@end
用法:
NSData *someData = ...;
NSString *someDataHexadecimalString = [someData hexadecimalString];
这“可能”比调用 [someData description]
然后删除空格、< 和 > 更好。剥离角色感觉太“hacky”了。另外,你永远不知道 Apple 将来是否会更改 NSData 的 -description
格式。
注意:有人联系我询问此答案中代码的许可问题。我特此将我在此答案中发布的代码的版权奉献给公共(public)领域。
关于iphone - 将 NSData 序列化为十六进制字符串的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1305225/