これまでシリアルポートからの着信データを処理するコードを書いています。データは固定フォーマットです。 このコードをjava(android)に移行します。しかし、私は多くの障害を見ます。パックされたC構造体と関数をjavaに移植できますか?
実際のコードはより複雑ですが、私はここに簡略化されたバージョンがあります:
#define byte unsigned char
#define word unsigned short
#pragma pack(1);
struct addr_t
{
byte foo;
word bar;
};
#pragma pack();
bool RxData(byte val)
{
static byte buffer[20];
static int idx = 0;
buffer[idx++] = val;
return (idx == sizeof(addr_t));
}
Rxデータ機能は、バイトが受信されるたびに呼び出されます。データの完全なチャンクが入っている場合、trueを返します。
障害物のいくつか:
使用されるデータ型は、Javaには使用できません。他のスレッドでは、より大きなデータ型を使用することをお勧めしますが、この場合、これは実行可能な解決策ではありません。
この場合、構造体のサイズは正確に3バイトです。 #pragmaステートメントが重要な理由です。さもなければ、Cコンパイラはメモリ使用のためにそれを「最適化」し、その結果として異なるサイズにすることができる。
Javaにはsizeof関数がありません。この種の状況では、代替手段が見つかりませんでした。
私は 'sizeof'を3の固定値に置き換えることができますが、それは非常に悪い練習IMOになります。
Javaでこのようなコードを書くことは可能でしょうか?または、Android StudioにネイティブのCソースを追加することをお勧めしますか?
'native'とJNIを使用できませんか?過度のものかもしれないが、見る価値があるかもしれない。少なくともあなたはCコードをそのまま保ちます。それ以外の場合は、Javaで 'byte [3]'を使用します。そしてきちんと言葉にされた質問。 downvoteについてはわからない。ところで、 'unsigned short'のサイズはプラットフォームによって異なります。 – Bathsheba
Javaプリミティブデータ型は、プラットフォームに依存してはならない固定サイズなので、値をハードコーディングしても問題にはなりません。単純に、ByteInputStreamを使用して適切なバイト数をフィールドに読み込むdeserialize関数を記述することができます。 –
'RxData()'を20回以上呼び出すと、バッファオーバーフローが発生します。 –