2016-03-03 39 views
0

我有一个问题: 我正在通过使用memcpy(在C中)并在char缓冲区内存储一个双变量来进行强制转换。我想要做的是将缓冲区内的char转换回初始变量(double)。如果我转换缓冲器的每一个位置,我得到ASCII字符,没有可变从memcpy回到双变量

的真正价值我后我的代码,以明确更好的我的问题的转换:

int counter = 1; 
double pippo = 100.0;      
const int cPacketSizeInBytes = 40;  
char packet[cPacketSizeInBytes]; 
do 
{ 
    .....; 
    .....; 
    memcpy(&packet[32], (char*)&pippo, sizeof(double)); 
    serverSocket.Send((char*)&packet, cPacketSizeInBytes); 
    pippo += 3.0; 
    if (pippo > 180.0) pippo = 0.0; 
    counter++; 

    if(!(counter%100)) 
    { 
     printf("Pippo value (double) is : %f\n", pippo); 

     for (int i = 32; i < 40; i ++) { 
      printf("%c\n", packet[i]); 
      double x = (double)packet[i]; 
      printf("%f\n", x); 
     } 
    } 
} 

xpacket[i].. 中的ASCII字符的双重转换我怎样才能合并包内的所有字符(即packet[32....39])以获取返回值pippo

+1

您使用'memcpy'来编码数据包,那么为什么不再使用一个来解码数据包呢? 'double x; memcpy(&x,packet + 32,sizeof(double));' – MikeCAT

+1

谢谢!我会试试! – user2572206

+0

如果我的变量位于数据包的中间位置(即从位置8到位置15)......我必须使用sintax“memcpy(&x,packet + 8,sizeof(double));” ??它能够从位置8到15读取,或者我必须定义结束位置? – user2572206

回答

2

请注意,当您在套接字上发送某些内容时,必须考虑其内容,否则可能会以错误的值结束。

我建议你使用像“htonl”,“ntohl”这样的函数,因为这样的函数被设计来做到这一点。

编辑:而你的memcpy假设你的double是4个八位字节,所以主要是一个x32位机器。如果您的代码在x64架构上运行,我认为它会失败。对不起!那是错的。

+0

“你的memcpy假设你的double是4个八位字节,”为什么?在我的理解中,“double”通常是8字节长,如果sizeof(double)是8,代码似乎很好。 – MikeCAT

+0

我没有看到任何4字节假设。另外,x86和x64上的double是8个字节。机器位数不会影响它。 –

+0

如果我的变量位于数据包的中间(即从位置8到位置15),我将不得不使用sintax“memcpy(&x,packet + 8,sizeof(double));” ?? – user2572206