objective-c – 将NSData转换为Hex NSString

objective-c – 将NSData转换为Hex NSString,第1张

概述参考以下问题: Convert NSData into HEX NSString 我使用Erik Aigner提供的解决方案解决了这个问题,即: NSData *data = ...;NSUInteger capacity = [data length] * 2;NSMutableString *stringBuffer = [NSMutableString stringWithCapacit 参考以下问题: Convert NSData into HEX NSString

我使用Erik Aigner提供的解决方案解决了这个问题,即:

NSData *data = ...;NSUInteger capacity = [data length] * 2;NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];const unsigned char *dataBuffer = [data bytes];NSInteger i;for (i=0; i<[data length]; ++i) {  [stringBuffer appendFormat:@"%02X",(NSUInteger)dataBuffer[i]];}

但是,有一个小问题,如果后面有额外的零,则字符串值会有所不同.例如.如果hexa数据是字符串@“3700000000000000”,则使用扫描程序转换为整数时:

unsigned result = 0;NSScanner *scanner = [NSScanner scannerWithString:stringBuffer];[scanner scanHexInt:&result];NSLog(@"INTEGER: %u",result);

结果将是4294967295,这是不正确的.不应该是55,因为只有hexa 37被采取?

那么如何摆脱零呢?

编辑:(回应CRD)

嗨,谢谢你澄清我的疑虑.那你要做的是直接从一个字节指针读取64位整数吧?不过我有另一个问题.你如何实际将NSData转换为字节指针?

为了让您更容易理解,我将解释我最初的所作所为.

首先,我显示了我拥有的文件的数据(数据是十六进制)

NSData *file = [NSData dataWithContentsOffile:@"file path here"];NSLog(@"Patch file: %@",file);

输出:

接下来,我读取并偏移文件的前8个字节并将它们转换为字符串.

// 0-8 bytes[file seekTofileOffset:0];NSData *b = [file readDataOfLength:8];NSUInteger capacity = [b length] * 2;NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];const unsigned char *dataBuffer = [b bytes];NSInteger i;for (i=0; i<[b length]; ++i) {    [stringBuffer appendFormat:@"%02X",(NSUInteger)dataBuffer[i]];}NSLog(@"0-8 bytes HEXADECIMAL: %@",stringBuffer);

如您所见,0x3700000000000000是接下来的8个字节.我要访问接下来的8个字节的唯一变化是将SeekfileToOffset的值更改为8,以便访问接下来的8个字节的数据.

总而言之,您给我的解决方案很有用,但手动输入十六进制值是不切实际的.如果将字节格式化为字符串然后解析它们不是这样做的话,那么如何直接访问数据的前8个字节并将它们转换为字节指针?

解决方法 您似乎试图将存储在NSData中的8个字节转换为64位整数(0x3700000000000000中有8个字节).

如果这是你的目标,那么通过将字节格式化为字符串然后解析它们来实现它不是这样做的.您需要找出数据所在的endian格式(即最少或最重要的字节),然后使用适当的endian转换函数.

你得到4294967295(0xFFFFFFFF)的原因是因为你要求NSScanner读取一个32位整数并且你的数字(0x3700000000000000)溢出.

回应评论

由于x86是little-endian,你可以直接从字节指针读取一个小端64位整数,只需转换:

Byte bytes[] = { 0x37,0x00,0x00 };NSLog(@"%lld",*(int64_t *)bytes);

如果你需要阅读大端数据,那么你可以使用Endian64转换函数,如Endian64_Swap – 它只是翻转你所拥有的,所以读取然后翻转.

请注意,x86不需要对齐数据访问,但如果是,则性能会更好.

总结

以上是内存溢出为你收集整理的objective-c – 将NSData转换为Hex NSString全部内容,希望文章能够帮你解决objective-c – 将NSData转换为Hex NSString所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1004909.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存