2016-03-03 41 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