Со ссылкой на следующий вопрос: Convert NSData into HEX NSSStringПреобразования 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?
Итак, как мне избавиться от нулей?
EDIT: (В ответ на 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