将二进制数据解释为浮点型

时间:2018-11-28 22:46:30

标签: c floating-point

我有一个外部硬件仪表,可以通过TCP连接将测量的电压值作为浮点值发送。我正在编写一个C代码来捕获此数据。我写的第一个代码如下:

#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 5843 


int main(int argc, char const *argv[]){ 

struct sockaddr_in address; 
int sock = 0;
int valread; 

struct sockaddr_in serv_addr; 
    //data_points* data = malloc(sizeof(data_points)); 
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
    printf("\n Socket creation error \n"); 
    return -1; 
} 

memset(&serv_addr, '0', sizeof(serv_addr)); 

serv_addr.sin_family = AF_INET; 
serv_addr.sin_port = htons(PORT); 

if(inet_pton(AF_INET, "130.127.88.141", &serv_addr.sin_addr)<=0){ 
    printf("\nInvalid address/ Address not supported \n"); 
    return -1; 
} 

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){ 
    printf("\nConnection Failed \n"); 
    return -1; 
} 

float data;
valread = read( sock , (void*) &data, sizeof(float));
printf("value: %f\n", data);

return 0; 
}

此代码几乎是this geek-to-geek代码的副本。但是当我运行这段代码时,我得到的值如下:

 ./client 
 value: -0.000000

这是不可接受的值。因此,为了测试我得到的值,我对数据接收部分进行了如下修改:

unsigned char data[4];
valread = read( sock , (void*) data, sizeof(float)); 
printf("%d, %d, %d, %d\n", data[0], data[1], data[2], data[3]);

哪些印刷品:

./client 
65, 49, 110, 152

我将其手动转换为浮点值,如下所示:

 65  = 01000001
 49  = 00110001
 110 = 01101110
 152 = 10011000

将它们串联在一起可以得到:

01000001001100010110111010011000

,当解释为IEEE 754浮点数时,它给出11.0895,这是电表发送的实际值。 为什么我的初始代码没有给出该值?如何转换?任何帮助,将不胜感激。

0 个答案:

没有答案