如何将NSData的十六进制字符串转换为普通的十六进制字符串?

时间:2013-11-18 17:29:10

标签: objective-c hex

所以,取一个unsigned int,比如4286578687。

从此网站:http://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html

我得到十六进制值为:FF7FFFFF

但是,如果我把这个int放到NSData中就像这样:

//The unsigned int is unsignedInt and its length is unsignedLength 

NSData *thisData = [NSData dataWithBytes:&unsignedInt length:unsignedLength];

然后使用description方法,该方法应该将数据的十六进制值作为字符串返回:

NSLog(@"data as hex: %@", [thisData description]);

输出结果为:

data as hex: <ffff7fff>

在同一网站上评价为4294934527。

所以看起来NSData正在使用一些非标准的十六进制格式。谁能告诉我如何回到真正的十六进制格式?

2 个答案:

答案 0 :(得分:2)

您看到将unsigned int的字节存储在big-endian和little-endian之间存在差异。

如果您想保证NSData的输出是big-endian格式,那么您应该执行以下操作:

unsigned int x = 4286578687;
unsigned int big = NSSwapHostIntToBig(x);
NSData *thisData = [NSData dataWithBytes:&big length:sizeof(big)];
NSLog(@"data as hex: %@", thisData);

这会记录data as hex: <ff7fffff>的预期结果。

此代码适用于任何处理器类型,并始终以big-endian格式提供结果。

当以另一种方式返回时,您需要使用NSSwapBigIntToHost函数来确保将big-endian数据正确转换为本地格式。

答案 1 :(得分:0)

您可以尝试这样的事情:

NSInteger i = 4286578687;
NSLog(@"hex : %@", [NSString stringWithFormat:@"%X", i]);

// Result
>>> hex : FF7FFFFF