1

Nx32論理配列として保存されているデータがあります。各行は、送信している UDP データの 1 ワードを表します。任意の単語、単語の一部、または単語の境界を越えてアクセスできるため、論理配列として格納しています。uint32(つまり、 aを as として保存するかもしれません[array(1, 17:32) array(2, 1:16)]。現在、入力ワードの位置、LSB、および MSB に基づいて、ユーザーが必要とするデータを見つけています。

データ内の場所を読み書きするためにクラスに書き込んでいる機能では、基本的に、特定の MATLAB 数値型または char をバイナリ形式に変換してから、バイナリ形式を論理配列に格納するか、またはその逆を行う必要があります。基本的に、多くのnum2hex変換があります。(実際、たとえば、フロートをバイナリに変換しようとしました dec2bin(hex2dec(num2hex(pi)))が、出力が正しくありません!)。

C では、unionデータ型間で a を簡単にキャストできます。を書いて、それを直接intとして読み取ることができました。floatこの機能は MATLAB で可能ですか? それが役立つ場合、私はすべてのツールボックスにアクセスできます。

4

2 に答える 2

4

Matlab の共用体の概念と直接一致するものには詳しくありませんが、(より多くのメモリを使用して) 同じ結果を得ることができます。私はあなたが探していると信じていますtypecast、例えば

x = uint32([1 2 3]);
y = typecast(x,'single')

有効ビットの順序を変更する必要がある場合は、 を使用しますswapbytes

編集:論理を処理する場合は、中間ステップとしてバイナリ文字列を使用する必要があります。それは問題ないと思いますdec2bin(私が見る限り16進数にする必要はありません)。おそらくあなたの問題は、書き込むビット数を示すオプションの2番目の引数を提供していないことですか?

x = dec2bin(22,32)

論理に変換して、バイトを反転できます

y = x=='1';
y = fliplr(y);

また、Matlab 内からJavaを使用することを検討することもできます。たとえば、これは double の場合です。

x = java.lang.Double.doubleToLongBits(22);
y = java.lang.Long.toBinaryString(x)
于 2013-10-01T15:50:35.860 に答える
1

dec2bin(hex2dec(num2hex(pi))) の使用は正確ではありません。浮動小数点数は大きな数値に対して大きなギャップがあり、整数を正確に表すことができないためです。1 つの回避策は、64 ビットの 16 進文字列を 2 つの 32 ビット文字列に分割することです。例えば、

hexpi = num2hex(pi)
firstbin = dec2bin(hex2dec(hexpi(1:8)));
secondbin = dec2bin(hex2dec(hexpi(9:16)));

% reconstruct
firsthex = dec2hex(bin2dec(firstbin));
secondhex = dec2hex(bin2dec(secondbin));
hexpi_reconstructed = [firsthex secondhex]
pi_reconstructed = hex2num(hexpi_reconstructed)

そのコードは、同じ 16 進数ビットを再現する必要があります。

于 2013-10-01T16:53:55.927 に答える