2013-05-17 5 views
0

J'essaie d'assigner un fichier flottant à partir d'une chaîne binaire brute, mais je ne comprends pas ce à quoi je m'attendrais.Convertir un fichier binaire en fichier flottant

int main() 
{ 
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78}; 
    float tempFloat; 
    int position = 3; 

    printf("recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]); 
    memcpy(&tempFloat, recBuffer + position, 4); 
    printf("tempFloat=%f (0x%x)\n", tempFloat, tempFloat); 
    return 0; 
} 

Ma sortie ressemble:

recBuffer=0x12345678 
tempFloat=*************************************** (0x40000000) 

La procédure ci-dessus fonctionne pour les entiers:

int main() 
{ 
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78}; 
    int tempFloat; 
    int position = 3; 

    printf("recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]); 
    memcpy(&tempFloat, recBuffer + position, 4); 
    printf("tempFloat=%d (0x%x)\n", tempFloat, tempFloat); 
    return 0; 
} 

avec une sortie:

recBuffer=0x12345678 
tempFloat=2018915346 (0x78563412) 

(je suis au courant Endianness.)

J'ai essayé d'assigner le flottant directement, mais j'ai quand même quelque chose de bizarre en sortie (que signifient tous les *)?

int main() 
{ 
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78}; 
    float* tempFloat; 
    int position = 3; 

    printf("recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]); 
    tempFloat = (float*)(recBuffer + position); 
    printf("tempFloat=%f (0x%x)\n", *tempFloat, *tempFloat); 
    return 0; 
} 

avec sortie:

recBuffer=0x12345678 
tempFloat=*************************************** (0x40000000) 

Toute séquence binaire doit me donner une sortie, comme 0x78563412 = 1.73782443614495040019632524267E34. Je ne suis pas sûr pourquoi 0x40000000 = *. Ça devrait être 2.0E0. Qu'est-ce que je fais de mal ?! Toute aide serait appréciée!

(malheureusement, je travaille sur une vieille machine QNX, sans débogueur. Il suffit simplement printf() 's pour me aider le long).

+0

Je pense que vous voulez dire chaîne "byte" brut, non "binaire" – Mike

+2

Le format '% en x' ne sera pas imprimer la' float' parce que l'appel à 'printf()' convertit automatiquement le 'float' à un 'double' (et quelque chose de plus court que' int' à 'int'). Que se passe-t-il lorsque vous utilisez '% e' au lieu de'% f'? –

+0

je reçois: 'recBuffer = 0x12345678 tempFloat = ************************************** * (1.737824e + 034) ' Incroyable. Ce n'est jamais où vous vous attendez. Merci beaucoup. –

Répondre

1
printf("tempFloat=%d (0x%x)\n", tempFloat, tempFloat); 
         ^     | 
          |      | 
          +---------------------+ 

Le spécificateur %x est utile pour les nombres entiers, mais vous passez une valeur float au printf. Donc, la sortie n'est pas une valeur significative.

+0

Ça l'a fait! 'recBuffer = 0x12345678 tempFloat = *********************************** (1.737824) e + 034) ' Je ne comprends toujours pas pourquoi% f retournerait ****, mais je suis heureux memcpy() fait ce que je pense. Merci de votre aide! –

0
int main(){ 
    char recBuffer[] = {0x44, 0x42, 0x96, 0x12, 0x34, 0x56, 0x78}; 
    float tempFloat; 
    int position = 3; 

    printf("recBuffer=0x%x%x%x%x\n", recBuffer[3], recBuffer[4], recBuffer[5], recBuffer[6]); 
    memcpy(&tempFloat, recBuffer + position, 4); 
    printf("tempFloat=%f (0x%x)\n", tempFloat, *(unsigned*)&tempFloat); 
    return 0; 
} 
/* 
recBuffer=0x12345678 
tempFloat=17378244361449504000000000000000000.000000 (0x78563412) 
*/ 
+0

% f me donne encore *******, mais en utilisant vos conseils: 'printf ("tempFloat =% e (0x% x) \ n", tempFloat, * (* non signé) & tempFloat);' me permet pour obtenir la valeur hexadécimale brute !: 'recBuffer = 0x12345678 tempFloat = 1.737824e + 034 (0x78563412)'. Cela m'aide beaucoup, merci! –

+0

Intéressant. – BLUEPIXY

Questions connexes