Con riferimento alla seguente domanda: Convert NSData into HEX NSSStringConversione NSData in Hex NSString
Ho risolto il problema utilizzando la soluzione fornita da Erik Aigner che è:
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]];
}
Tuttavia, c'è un piccolo problema che se ci sono degli zeri in più sul retro, il valore della stringa sarebbe diverso. Per es. se i dati hexa è una stringa @ "3.700.000 miliardi", quando convertiti usando uno scanner a intero:
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:stringBuffer];
[scanner scanHexInt:&result];
NSLog(@"INTEGER: %u",result);
Il risultato sarebbe 4294967295, che non è corretto. Non dovrebbe essere 55 come viene preso solo l'hexa 37?
Quindi, come faccio a sbarazzarmi degli zeri?
EDIT: (In risposta alla CRD)
Ciao, grazie per chiarire i miei dubbi. Quindi quello che stai facendo è in realtà leggere il numero intero a 64 bit direttamente da un puntatore a byte giusto? Comunque ho un'altra domanda. Come si esegue effettivamente il cast di NSData su un puntatore a byte?
Per semplificare la comprensione, spiegherò cosa ho fatto in origine.
In primo luogo, quello che ho fatto è stato per visualizzare i dati del file che ho (i dati sono in formato esadecimale)
NSData *file = [NSData dataWithContentsOfFile:@"file path here"];
NSLog(@"Patch File: %@",file);
uscita:
successivo, quello che ho fatto è stato leggere e compensare i primi 8 byte del file e convertirli in una stringa.
// 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);
Come si può vedere, 0x3700000000000000 è il successivo 8 byte. Le uniche modifiche che avrei dovuto fare per accedere ai successivi 8 byte sarebbe quello di cambiare il valore di SeekFileToOffset a 8, in modo da accedere ai successivi 8 byte di dati.
Tutto sommato, la soluzione che mi hai dato è utile, tuttavia non sarebbe pratico inserire manualmente i valori esadecimali. Se la formattazione dei byte come una stringa e quindi l'analisi non è il modo per farlo, allora come posso accedere direttamente ai primi 8 byte dei dati e convertirli in un puntatore a byte?
Questa è un'implementazione estremamente lenta. Formattare prima in un buffer e poi convertire in 'NSString'. – trojanfoe