私は、各ペイロードバイトのMSBをMSBコレクションバイト(septett)に抽出し、受信側にMSBを再注入するバイナリプロトコルを持っています。ペイロードは、n個の4バイトフレームで構成され、送信側(私の場合は6個)に応じて配置されます。MSBが削除/復元されるようにバイト値を変換する
ワイヤーに見られるように、これらの2つの例示的なフレームは、そのseptett(最後のバイト)と、次のとおりのMSBを再注入して、
0x2E 0x00 0x5F 0x00 0x04
0x79 0x01 0x38 0x22 0x04
それらが同じフレーム、クライアント側である:
0x2E 0x00 0xDF 0x00
0x79 0x01 0xB8 0x22
変換を行うC関数は、this documentの9および10ページで定義されています。私のこれらのバージョンは、Javaで以下のとおりです。私が持っている問題は、この作品のどれもが動作しないことです、なぜ私は混乱しています。私はワイヤーから4バイトを渡し、同じバイトを手に入れて、そのままにします。私はここで何が間違っているかを理解する助けをすることができました。 Javaでは
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;
}