2013-05-17 5 views
0

Я пытаюсь назначить поплавок из исходной двоичной строки, но я не понимаю, чего бы я ожидал.Преобразование двоичных данных в float

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; 
} 

Мой выход выглядит следующим образом:

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

выше процедура работает для целых чисел:

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; 
} 

с выходом:

recBuffer=0x12345678 
tempFloat=2018915346 (0x78563412) 

(я знаю Endianness.)

Я попытался назначить поплавок напрямую, но я все еще получаю что-то странное как результат (что означают все * *?).

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; 
} 

с выходом:

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

Любая двоичная последовательность должна дать мне выход, так как 0x78563412 = 1.73782443614495040019632524267E34. Я не уверен, почему 0x40000000 = *. Он должен быть 2.0E0. Что я делаю неправильно ?! Любая помощь будет оценена!

(к сожалению, я работаю на старой машине QNX без отладчика. Просто попробую printf() помочь мне).

+0

Я думаю, что вы имеете в виду сырые «байты» строку, а не «двоичный» – Mike

+2

Параметр '% формат x' не будет печатать' float', потому что вызов 'Е()' автоматически преобразует 'float' к «double» (и чем короче, чем 'int' to' int'). Что происходит, когда вы используете '% e' вместо'% f'? –

+0

Я получаю: 'recBuffer = 0x12345678 tempFloat = ************************************** * (1.737824e + 034) ' Удивительно. Это никогда не бывает так, как вы ожидали. Огромное спасибо. –

ответ

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

%x спецификатор полезно для целых чисел, но вы передаете значение float к printf. Таким образом, выход не имеет значимого значения.

+0

Вот и все! 'recBuffer = 0x12345678 tempFloat = *************************************** (1.737824) e + 034) ' Я все еще не понимаю, почему% f вернется ****, но я счастлив, что memcpy() делает то, что я ожидаю. Спасибо за помощь! –

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 все еще дает мне *******, но, используя ваш совет: 'printf (" tempFloat =% e (0x% x) \ n ", tempFloat, * (unsigned *) & tempFloat);' позволяет мне для получения шестнадцатеричного значения !: 'recBuffer = 0x12345678 tempFloat = 1.737824e + 034 (0x78563412)'. Это помогает мне, спасибо! –

+0

Интересно. – BLUEPIXY

Смежные вопросы