Bonjour,
Donc j'ai un soucis étrange.
En résumé je récupère un flux de bytes d'une base de données (qui a été créé en C++ (le flux pas la base)).
LargeObject objet_donnees = lobj.open(oid);
ensuite je lis une ligne de données complète
byte[] tab_byte = objet_donnees.read(720*4);
comme il s'agit de float je lis un multiple de 4 byte
puis je wrap ça dans un ByteBuffer qui normalement doit me convertir ces bytes en float
ByteBuffer byte_buf = ByteBuffer.wrap(tab_byte);
puis
float valeur = byte_buf.getFloat();
(et ça avance dans le buffer (j'ai une boucle dessus qui va de i=1 à i*4<=byte_buf.capacity() en incrémentant i de 1))
et donc le soucis est que ma valeur en system.out.println est vraiment étrange
du genre si je la sort en hexa :
0x0.014082p-126
et donc en normal
5.7488E-41
ce qui est plutot chelou
Aurai-je fais une erreur idiote quelque part ? (par exemple le println permet-il vraiment de faire ça ?)
Ou alors c'est un soucis de conversion que je n'ai pas compris ?
(rq : j'ai mis les types de données histoire de bien montrer ce que je manipule)
ps :
j'ai trouvé un code qui fait une conversion, donc est-ce que le bytebuffer ne sert donc pas à ça et qu'il faut utiliser un truc comme ci-dessous ?
Code :
- public static float arr2float (byte[] arr, int start) {
- int i = 0;
- int len = 4;
- int cnt = 0;
- byte[] tmp = new byte[len];
- for (i = start; i < (start + len); i++) {
- tmp[cnt] = arr[i];
- cnt++;
- }
- int accum = 0;
- i = 0;
- for ( int shiftBy = 0; shiftBy < 32; shiftBy += 8 ) {
- accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy;
- i++;
- }
- return Float.intBitsToFloat(accum);
- }
|
(http://www.captain.at/howto-java-convert-binary-data.php)
Message édité par jan san kar le 28-02-2007 à 10:49:14