2009-10-06 7 views

Répondre

6

expérimentent avec ceci:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *file = [documentsDirectory stringByAppendingPathComponent:@"binaryData"]; 

float b = 32.0f; 

NSMutableData *data = [NSMutableData dataWithLength:sizeof(float)]; 
[data appendBytes:&b length:sizeof(float)]; 
[data writeToFile:file atomically:YES]; 

NSData *read = [NSData dataWithContentsOfFile:file]; 
float b2; 
NSRange test = {0,4}; 
[read getBytes:&b2 range:test]; 

La chose étrange est que le fichier écrit semble être 8 octets et non 4. Il est même possible d'initialiser le NSData avec 0 longueur, ajoutez un flotteur puis écrire, puis le fichier sera de 4 octets. Pourquoi NSData ajoute 4 octets par défaut? Un NSData de longueur 4 devrait aboutir à un fichier de longueur 4, pas à 8.

+0

Peut-on utiliser un éditeur hexadécimal pour examiner le contenu du fichier quand il dispose de 8 octets? Il me semble que vous devriez être en mesure de choisir 4 qui sont votre flotteur et l'autre 4 peut vous donner une idée de ce qui ne va pas. – Tim

+0

En effet. Le dernier 4 est le flotteur. Le fichier ressemble à ceci: 00 00 00 00 00 00 00 42 – quano

+0

Apparemment, initier un NSMutableData avec une longueur l'amène à ajouter cette longueur à ses données et à pointer vers l'espace après. L'initialiser avec la longueur 0 est la solution. Alors on peut se demander pourquoi on voudrait l'initier avec n'importe quelle autre longueur que 0 du tout. – quano

3

Notez que Objective-C est seulement une extension du langage de programmation C.

Je crée généralement une NSFileHandle et écrire des données binaires ainsi:

NSFileHandle handle*; 
float f; 

write([handle fileDescriptor], &f, sizeof(float)); 
Questions connexes