Bonjour,
je travaille actuellement sur une chaine de traitement dont une composante (écrite en c) effectue la lecture d'un fichier binaire et en extrait des valeurs double à partir de 2 octets,
je vous mets une version simplifiée ici (normalement, les valeurs sont écrites dans une matrice de valeurs, les variables globales ont été initialisés avec des valeurs bidons pour les tests: Coeffp = 0.01 et nbLus = 200):
/** remplit le tableau PLUIE1 avec les valeurs presentes dans le tableau
* en les multipliant avec le coefficient defini par la variable CoeffP
* @param filLu : flux du fichier
*/
int remplirPLUIE1(FILE* filLu){
int i=0, j=0;
unsigned short valLu;
char *val = (char *)calloc( sizeof(unsigned short)+1, sizeof(char));
float valeur;
printf(" CoeffP == %f\n",CoeffP);
/* Parcours du fichier en lecture */
rewind (filLu);
fread(&valLu, sizeof(unsigned short), 1, filLu);
for(i=0; i<nbLus && !feof(filLu); i++){
sprintf(val, "%d", valLu); // on prend la valeur sur 2 octets
valeur = atoi(val)*CoeffP; // le coeff est en flottant
printf("%f\n",valeur); // on affiche
fread(&valLu, sizeof(unsigned short), 1, filLu);
}
return 0;
}
le probleme, c'est que je voudrais faire cette lecture dans le programme principal (java)
j'ai donc fait quelques petits tests comme par exemple:
/**
* effectue la lecture d'un fichier binaire et extrait les données dans une Observation
* @param fichierBinaire: l'uri du fichier binaire
* @return une Observation
*/
public static void lireFichierBinaire(String fichierBinaire) {
DataInputStream in = null;
System.out.println(" lecture du fichier binaire " + fichierBinaire);
System.out.println(" CoeffP == " + CoeffP);
System.out.println(" lireFichierBinaire");
try {
// on crée un input stream de bytes
in = new DataInputStream(new FileInputStream(fichierBinaire));
// le compteur (sert à se reperer dans la liste des capteurs)
int compteur = 0;
char c;
// on lit les octets 2 par 2
while (compteur < nbLus && (c = in.readChar()) != -1) {
System.out.println("" + ((double) (int)c * CoeffP));
compteur++;
}
} catch (IOException ex) {
System.out.println(ex);
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
System.out.println(ex);
}
}
}
mais les resultats ne concordent pas, savez vous par hasard quelles modifications sont à apporter à cette fonction pour que ca marche ?
j'ai aussi essayé ca:
/**
* effectue la lecture d'un fichier binaire et extrait les données dans une Observation
* @param fichierBinaire: l'uri du fichier binaire
* @return une Observation
*/
public static void lireFichierBinaire2(String fichierBinaire) {
DataInputStream in = null;
System.out.println(" lecture du fichier binaire " + fichierBinaire);
System.out.println(" CoeffP == " + CoeffP);
System.out.println(" unsignedByteToInt1");
try {
// on crée un input stream de bytes
in = new DataInputStream(new FileInputStream(fichierBinaire));
byte[] byteArray = new byte[2];
// le compteur (sert à se reperer dans la liste des capteurs)
int compteur = 0;
// on lit les octets 2 par 2
while (compteur < nbLus && in.read(byteArray) != -1) {
System.out.println("" + ((double) byteArrayToInt(byteArray) * CoeffP));
compteur++;
}
} catch (IOException ex) {
System.out.println(ex);
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
System.out.println(ex);
}
}
}
private static int byteArrayToInt(byte[] byteArray) {
int total = 0;
// for (int i = 0; i < byteArray.length; i++) {
// total += ((byteArray.length - i) * 255) * byteArray[i] / 255;
// }
// total = byteArray[0] * byteArray[1];
int a = unsignedByteToInt(byteArray[0]);
int b = unsignedByteToInt(byteArray[1]);
System.out.print(""+byteArray[0]+" "+byteArray[1]+" "+a+" "+b+" >> ");
// total = a*255 + b;
total = byteArray[0] * byteArray[1];
return total;
}
/**
* effectue la conversion d'un byte en int en traitant le byte comme unsigned
* @param b
* @return
*/
private static int unsignedByteToInt(byte b){
int res = (int)b;
if (res < 0){
res = 128 + (128 + res); // voir complément à deux
}
return res;
}mais les résultats sont également erronés par rapport aux résultats obtenus avec la focntion c...
les fonctions tests ainsi qu'un fichier binaire sont accesibles ici:
[url]
http://benjbb3sp.free.fr/lecture%20binaire/
[/url]

