各ペイロードバイトのMSBをMSBコレクションバイト(セプテット)に抽出して送信し、受信側でMSBを再注入するバイナリプロトコルがあります。ペイロードは、送信者に応じてn個の4バイトフレームで構成されます(私の場合は6個)。
これらは、ワイヤー上に見られるように、セプテット(最後のバイト)を持つ2つのサンプルフレームです。
0x2E 0x00 0x5F 0x00 0x04
0x79 0x01 0x38 0x22 0x04
これらは同じフレームであり、クライアント側であり、MSBが再注入されています。
0x2E 0x00 0xDF 0x00
0x79 0x01 0xB8 0x22
変換を行うC関数は、このドキュメントの9ページと10ページで定義されています。これらの私のバージョンは、Javaで以下のとおりです。私が抱えている問題は、これがどれも機能しないことであり、その理由について私は混乱しています。ワイヤーから4バイトを渡し、同じバイトをそのまま取得します。私はここで何が悪いのかを理解するのに役立つかもしれません(おそらく私が見ることができない些細なことです)。
private static byte[] vbusExtractSeptett(byte[] data, int offset, int length) {
byte septett = 0;
for (int i = 0; i < length; i++) {
if ((data[offset + i] & 0x80) != 0) {
data[offset + i] &= 0x7F;
septett |= 1 << i;
}
}
data[offset + length] = septett;
return data;
}
private static byte[] vbusInjectSeptett(final byte[] data, int offset, int length) {
byte septett = data[offset + length];
for (int i = 0; i < length; i++) {
if ((septett & (1 << i)) != 0)
data[offset + i] |= 0x80;
}
return data;
}