2012-03-30 8 views
2

名前付きパイプを介して配列に格納された浮動小数点数を別のプロセスに送る必要のあるスレッドを持つC++プロセスがあります。私はバイト配列を送信準備ができましたが、送信できる形式(つまりバイトに変換する方法)で浮動小数点を取得する方法があまりにもわかりません。名前付きパイプ(C++)を送るためにfloatをバイト[]に変換する

他のプロセスは同じマシン上のC#プロセスであり、私はBitConverterを使用して着信バイト配列の関連バイトを取得し、それをfloatに変更することができますが、私はC++にあまり慣れていないfloatをbyte []に​​変更する方法を知っています。

プラットフォームはWindowsです。私はVisual Studio 2010 C++を使用しています。

+0

C++プロセスも.NETフレームワークを使用していますか? –

+0

いいえ、それは管理されていません。 – Jkh2

+0

また、http://stackoverflow.com/questions/1906561/communication-between-c-and-c-sharp-through-pipeをご覧ください –

答えて

2

十分なシンプル:

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

次に、あなたがそれをしたいデータを移動するためのmemcpyを使用しています。

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

BIG注意点が2台のエンドマシン上のエンディアンを監視することです:

+0

フロートを私のバイト配列にコピーして、 index 100、memcpyを使用して長さ4の中間バイト配列にコピーせずに、大きなバイト配列に直接コピーできますか? – Jkh2

+0

はいできます。 memcpyに適切なターゲットアドレスを与えてください。実際、それは1つのライナーです: 'char * myBytes; memcpy(myBYtes + 100、&myFloat、myFloatのサイズ); '(void *'ではなくchar * myBytesでポインタ演算を使用できるように) – Arkadiy

2

迅速かつ汚い方法は、労働組合を使用することです。何度もendianness has been solvedを探しているので、その上でいくつかのリソースを検索してみてください。あなたのバイトが両側で一致するようにしてください。

EDIT:マシンのfloatのサイズと一致するようにユニオンのバイトが変更されました。

+0

組合はそれを行う最悪の方法です。 floatが8バイトの場合はどうなりますか?どこかにパディングがあるとどうなりますか? – Arkadiy

+0

ユニオンは正しい方法です。厳密なエイリアシングに問題はありません。あなたはバイト 'bytes [sizeof(float)]'を必要とします。 –

+0

私は組合が要素を同じメモリに占有させるべきなので、どのようにパディングが問題になるか興味があります。 sizeof(float)の部分は私が欠けていたものです。 –

関連する問題