gpt4 book ai didi

iphone - 将 NSData 序列化为十六进制字符串的最佳方法

转载 作者:行者123 更新时间:2023-12-03 18:08:27 27 4
gpt4 key购买 nike

我正在寻找一种很好的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com