私は、データレートの高い低レベルのプロトコルを使用しているため、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
を解析するには?私はランダムなバイトがぶら下がっている場合には、t
とax
をゼロに設定します。
更新
ドキュメントは素晴らしいではありません。まず、Float
を32-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
であるとは言わないが、私はその仮定をしているだけだ。
binary16 [半精度](https://en.wikipedia.org/wiki/Half-precision_floating-point_format)については、バイトをbinary32 [単精度]にコピーするだけです(https://en.wikipedia.org/wiki/Single-precision_floating-point_format)。変換を管理する必要があります。私は3バイト浮動小数点について何か聞いたことがありません... – LPs
私はここに@LPsに同意します。 IEEE-754は、一般に、浮動小数点数を表すために使用されます。浮動小数点数の最小の 'n 'バイトを読み取って、その数値を' x'精度で選んだと仮定することはできません。詳細はhttps://thirum.al/2dk4tx9をご覧ください。 – zapstar
Cはこの種の事件の痛みです:UBは捨てるだけです。あなたは確かに非常に特定のプラットフォームにビルドしています:3バイトのフロートはファンキーです。私はあなたの場合、インラインアセンブリのいくつかの行を検討したい:あなたは3バイトのレジスタを持っていますか? – Bathsheba