2016-10-18 26 views
0

私は、データレートの高い低レベルのプロトコルを使用しているため、2または3バイトを使用して番号の範囲に応じてfloatを表します。システムをより効率的にする。Cのフロートに2バイトまたは3バイトを変換する

私はこれらの数値を解析しようとしていますが、私が得意な値は私には分かりません。それらはすべてゼロであり、デバイスは問題の変数に対してゼロを出力するとは思いません。

私のバッファの最初の5バイトは、次のとおりです。FF-FF-FF-FF-FF

最初の2つのバイトはfloat tを構成しています。ドキュメントは、バイトがリトルエンディアンであると述べていることに注意してください。

float t = 0; 
memcpy(buffer, &t, 2); 

次の3つのバイトはfloat ax作る、私がやることを解析する:

float ax = 0; 
memcpy(buffer+2, &ax, 3); 

これは、これを処理するための正しい方法です

私はtを解析するには?私はランダムなバイトがぶら下がっている場合には、taxをゼロに設定します。

更新

ドキュメントは素晴らしいではありません。まず、Float32-bit IEEE 754 floating-point numberと定義します。

は、この引用がある:

To increase efficiency many of the data packets are sent as 24-bit signed integer words 
because 16-bits do not provide the range/precision required for many of the quantities, 
whereas 32-bit precision makes the packet much longer than required. 

は、バッファの最初の2つのバイトとしてt定義したテーブルがあります。範囲は0-59.999です。明示的にそれがFloatであるとは言わないが、私はその仮定をしているだけだ。

+4

binary16 [半精度](https://en.wikipedia.org/wiki/Half-precision_floating-point_format)については、バイトをbinary32 [単精度]にコピーするだけです(https://en.wikipedia.org/wiki/Single-precision_floating-point_format)。変換を管理する必要があります。私は3バイト浮動小数点について何か聞いたことがありません... – LPs

+0

私はここに@LPsに同意します。 IEEE-754は、一般に、浮動小数点数を表すために使用されます。浮動小数点数の最小の 'n 'バイトを読み取って、その数値を' x'精度で選んだと仮定することはできません。詳細はhttps://thirum.al/2dk4tx9をご覧ください。 – zapstar

+0

Cはこの種の事件の痛みです:UBは捨てるだけです。あなたは確かに非常に特定のプラットフォームにビルドしています:3バイトのフロートはファンキーです。私はあなたの場合、インラインアセンブリのいくつかの行を検討したい:あなたは3バイトのレジスタを持っていますか? – Bathsheba

答えて

-3

おそらく、引数が間違っている可能性があります。変更し、次のように:

memcpy (buffer, &t, 2); 

HTH

[編集

memcpy (&t, buffer, 2); 

に:ダウン私の答えを投票すべての人々に明確にするために、問題は確かに周りの引数に間違った方法もありません。バッファを読み込もうとしますが、memcpyの宛先として指定します]

+0

downvoterではなく、半精度の浮動小数点から単精度の浮動小数点にバイトをコピーすると動作しません.... – LPs

+0

@LPs私は理解しますが、OPはなぜ彼がすべてゼロを得ているのか分かりません。彼が実際にバッファから読み込むまで、memcpyが浮動小数点のためにうまくいかない理由はわかりません。 – Lelanthran

関連する問題