2012-03-30 75 views
2

我有一個C++進程,它有一個線程需要通過命名管道將存儲在數組中的浮點數發送到另一個進程。我已經構建好了可以發送的字節數組,但是我不太確定如何獲取可以發送的形式(即如何將它們轉換爲字節)的浮動。將float轉換爲byte []以通過命名管道(C++)發送

另一個進程是在同一臺機器上的C#進程,我假設我可以使用BitConverter獲取傳入字節數組中的相關字節並將其更改爲float,但我不太熟悉C++,知道如何將float更改爲byte []。

該平臺是Windows,我使用的是Visual Studio 2010 C++。

+0

您的C++過程是否也使用.NET框架? – 2012-03-30 14:15:07

+0

不,它是非託管的。 – Jkh2 2012-03-30 14:18:11

+0

也看看http://stackoverflow.com/questions/1906561/communication-between-c-and-c-sharp-through-pipe – 2012-03-30 14:27:51

回答

2

很簡單:

const void *data = &myFloat; 
size_t size = sizeof myFloat; 

然後使用memcpy來移動你想要的數據。

+0

如果我需要將float複製到我將發送的字節數組中索引100,我可以直接複製到大字節數組中,而無需使用memcpy複製到長度爲4的中間字節數組中? – Jkh2 2012-03-30 14:22:45

+0

是的,你可以。只需給memcpy一個合適的目標地址即可。事實上,這是一個單線程:'char * myBytes; memcpy(myBYtes + 100,&myFloat,sizeof myFloat);'('char * myBytes'而不是'void *',這樣我就可以使用指針算術)。 – Arkadiy 2012-03-30 14:28:06

2

的快速和骯髒的方法是使用一個聯盟:

union getBytes 
{ 
    float floatNumber; 
    byte bytes[sizeof(float)]; 
} number; 

的重要的提醒是看爲兩個端機器字節順序。在多次查找排序has been solved之前,請嘗試搜索一些資源。只要確保雙方的字節匹配。

編輯:在聯合更改字節以匹配機器上的浮動大小。

+0

聯合是關於做到最壞的方式。如果float是8字節呢?如果在某處填充會怎麼樣? – Arkadiy 2012-03-30 14:29:54

+0

聯合是正確的方式。它沒有嚴格別名問題。你只需要字節'bytes [sizeof(float)]'。 – 2012-03-30 14:33:08

+0

我好奇如何填充將是一個問題,因爲聯盟應該使元素佔據相同的內存。 sizeof(float)部分是我錯過的部分。 – 2012-03-30 14:33:37