所以,取一个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正在使用一些非标准的十六进制格式。谁能告诉我如何回到真正的十六进制格式?
答案 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