2

デバイスからいくつかの電圧を読み取るC++アプリケーションを作成しています。これらの測定値をで受け取り、float[]この配列をUDP経由でMATLABスクリプトに送信したいと思います。

C ++関数のsendtoはバッファーを取得する必要があり、MATLABで簡単に再アセンブルできるように、をバッファーにchar[]変換する方法がわかりません。何か案は?float[]char[]

私が遭遇した別の問題はその行です

addr.sin_addr = inet_addr("127.0.0.1");

inet_addrはunsignedlongを返しますが、私のコンパイラーは、=演算子が右側のunsigendlongデータ型を受け入れないことを教えてくれます。これについてのIideasはありますか?

4

3 に答える 3

5

任意のオブジェクト変数をバイトのシーケンスとしていつでも扱うことができます。この目的のために、任意のオブジェクトポインタをバイト配列(つまり任意のchar型)の最初の要素へのポインタとして再解釈することが明示的に許可されています(エイリアシングに違反したり、型のパンニングを構成したりすることはありません)。

例:

T x;
char const * p = reinterpret_cast<char const *>(&x);

for (std::size_t i = 0; i != sizeof x; ++i) { /* p[i] is the ith byte in x */ }

あなたの場合:

float data[N];
char const * p = reinterpret_cast<char const *>(data);

write(fd, p, sizeof data);
于 2013-01-22T21:32:18.203 に答える
1

UDPメッセージをテキストとしてフォーマットするかバイナリとしてフォーマットするかを決定します。テキストの場合、boost::lexical_castを使用してfloatを文字列に変換できます。UDPメッセージの文字列値は、任意の方法(カンマ区切り値、改行区切りなど)でフレーム化できます。または、JSONなどの既知の形式を使用することもできます。

バイナリデータを送信する場合は、ONC RPCで使用されるXDRなどの既知の形式を選択し、既存のライブラリツールを使用してバイナリメッセージを作成します。

inet_addrエラーに関しては、addr.sin_addrはstructin_addrです。次のように、結果をsin_addr構造のs_addrメンバーに割り当てる必要があります。

addr.sin_addr.s_addr = inet_addr("127.0.0.1");
于 2013-01-22T21:47:35.477 に答える
0

あなたの投稿には2つの質問があります。私はそれが本来あるべき姿ではないと信じています。

float []-> byte [] conersionについては、matlabが浮動小数点変数をどのように格納するかを確認する必要があります。万が一、コンパイラと同じ形式を使用している場合は、コンピュータのセットアップなどでのみ、これらをバイト配列[]として送信できます。それ以外の場合(互換性のないfloatバイト形式、複数のマシン)は、手動変換を作成する必要があります。最初に各フロートを(たとえば)文字列に、次に多くのフロートに。あなたの行は次のようになります。

1.41234;1.63756;456345.45634

addr.sin_addrに関しては-私はあなたがそれを間違っていると思います。アクセスする必要があります

addr.sin_addr.s_addr = inet_addr("1.1.1.1");

于 2013-01-22T21:37:05.153 に答える