:Convert NSData into HEX NSSString轉換NSData的成十六進制的NSString參照以下問題
我已經解決了這是由埃裏克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]];
}
然而,存在一個小問題如果後面有額外的零,字符串值將會不同。例如。如果六數據是字符串@「37000000億」,當使用掃描儀到整數轉換的:
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:stringBuffer];
[scanner scanHexInt:&result];
NSLog(@"INTEGER: %u",result);
其結果將是4294967295,這是不正確。它不應該是55,因爲只有六十七採取?
那麼我該如何擺脫零?
編輯:(針對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個字節並將它們轉換爲字節指針?
這是一個非常緩慢的實施。首先格式化成緩衝區,然後轉換爲'NSString'。 – trojanfoe