Что касается следующего вопроса: Преобразовать NSData в HEX NSString
Я решил проблему, используя решение, предоставленное Эриком Айгнером:
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]];
}
Однако есть одна небольшая проблема: если сзади будут дополнительные нули, строковое значение будет другим. Например, если шестнадцатеричные данные представляют собой строку @ "3700000000000000", при преобразовании с помощью сканера в целое число:
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:stringBuffer];
[scanner scanHexInt:&result];
NSLog(@"INTEGER: %u",result);
Результатом будет 4294967295, что неверно. Разве это не должно быть 55, поскольку берется только гекса 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 байтам данных и преобразовать их в байтовый указатель?
NSString
. - person trojanfoe   schedule 21.11.2012