Comment analyser un fichier binaire avec floats (généré par Java) avec Cocoa Touch?

StackOverflow https://stackoverflow.com/questions/401783

  •  03-07-2019
  •  | 
  •  

Question

Étant donné le code Java suivant pour générer un fichier binaire:

DataOutputStream out = new DataOutputStream(new FileOutputStream("foo.dat"));
out.writeInt(1234);
out.writeShort(30000);
out.writeFloat(256.384f);

J'utilise le code Objective-C suivant et parviens à analyser les valeurs int et short:

NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"dat"];
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];

unsigned long intValue;
memcpy(&intValue, [[file readDataOfLength:4] bytes], 4);
intValue = NSSwapBigLongToHost(intValue);

unsigned short shortValue;
memcpy(&shortValue, [[file readDataOfLength:2] bytes], 2);
shortValue = NSSwapBigShortToHost(shortValue);

Mon problème pour le moment concerne la valeur float: des indices sur la façon de l'analyser?

Était-ce utile?

La solution

Seulement nous les fonctions et types fournis par <Foundation/Foundation.h>.

NSSwappedFloat bigEndianFloat;
memcpy(&bigEndianFloat, [[file readDataOfLength:4] bytes], 4);
float floatValue = NSSwapBigFloatToHost(bigEndianFloat);

Notez qu’ils utilisent un type spécial pour maintenir le flottant avant que les octets ne soient échangés. En effet, si vous permutez les octets d’une valeur à virgule flottante, elle peut être transformée en un NaN de signalisation et, sur certains processeurs, cela provoquera une exception matérielle en l’attribuant simplement à une variable.

Autres conseils

Désolé, je ne peux pas fournir la réponse complète, mais je peux dire que le flottant Java est enregistré dans le fichier en tant que représentation IEEE 754 à quatre octets du flottant, comme indiqué dans ce document:

http: //java.sun.com/j2se/1.5.0/docs/api/java/lang/Float.html#floatToIntBits(float)

Ceci décrit la structure exacte de la valeur sauvegardée, vous pouvez donc la lire en tant qu'int et analyser manuellement les bits de la signification et de l'exposant dans un float. Il semble qu'il devrait y avoir un appel de bibliothèque pour analyser les valeurs à virgule flottante empaquetées dans un int de ce format. Espérons que quelqu'un d'autre connaisse un appel de la bibliothèque pour gérer cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top