データを送信するための Bluetooth モジュールで遊んでいます。データには、3 つの回転 (0 ~ 360) と 3 つのボタンの状態 (ビット (0 または 1)) が含まれます。
これを文字列にマッピングしてみました (例: 360_52_265_010% : x_y_z_bbb% % はデータ ストリームを終了するためのマークです) が、これを送信すると実際には最大 16 バイト (多かれ少なかれ) かかります。 )...
これは受け入れがたい。許容できない小さな遅延があるため、次のアイデアを思いつきました。
- 最大値が 360 であるため、1 つの回転軸 = 9 ビットのデータであり、最大 9 ビットを使用します。
- ボタンの状態には 3 回のローテーション + 3 ビットが必要なので、合計すると 30 ビットになります。
- インターウェブで最適なデータ型を検索したところ、Google からフロート (32 ビット) が返されました
Bluetooth接続を介して4バイトが17バイトをはるかに上回るため、これらすべての値を単一のフロートにマッピングすることを考えています(私は思う)
より良い解釈のために、私はうまくいくと思うものをこの美しい表現にしました:
現在、ビットシフトの経験はありません。主なコンセプトはわかっていますが、これを機能させることができないようです。私はこことここで他のいくつかの投稿を見ましたが、マスクは私を混乱させます.
だから私はそれを求めて、この小さなコードを試しました:
int xx = 270, yy = 5, zz = 26;
//3 buttons; left, right, and trigger. I used a byte cause I actually have no idea how I could store just one bit
byte ll = 0, rr = 0, tt = 1;
//in here I tried to bitshift the values. Hence the word tried :(
float packed = (float)(xx << 22 | yy << 13 | zz << 4 | rr << 3 | ll << 2 | tt << 1);
これは 67113578 の float 値を吐き出します (編集これは間違っています。この値は、コンソールに出力するために文字から文字列に変換されました)
そのため、誰かがこれらの値を 1 つの float にパックして元のデータに戻すのを手伝ってくれるかどうか疑問に思っていました。
助けてくれてありがとう!