TCP/IP プロトコルを介してデバイスと通信する必要があるプロジェクトに取り組んでいます。デバイスは大量のデータを送信しますが、これをどうにかしていくつかのオブジェクト/構造体に解析したいと考えています。
データパッケージの例 (TCP バッファー [] 内):
[64] [1] [78] [244] [77] [189] [249] [149] hcurrent
[64] [1] [78] [247] [89] [95] [104] [85] htarget
[0] [0] [0] [0] [0] [0] [0] [0] qcurrent
[188] [220] [97] [3] [66] [62] [0] [0] kcurrent
[66] [0] [102] [103] [66] [99][153] [154] mcurrent
[253] [191] [246] [74] [170] [216] [242] [29] fmode
[102] [191] [246] [74] [178] [44] [92] [72] tmil
[137] mode
現在、このパッケージ フレームは次のように識別されます。
double hcurrent
double htarget
double qcurrent
float kcurrent
float mcurrent
float fmode
float tmil
unsigned char mode
私の考えは、どうにかしてデータを上記と同じ構造を持つ構造体に直接解析できるということでした。もちろん、それがどの種類のデータであるかを判断するために、いくつかの重要な値を特定する必要があります。
これはどのように行うことができますか?
私は iOS デバイス用にコーディングしているので、Objective-C または C(++) でなければなりません。
EDIT(データグラムの各部分を構造体にコピーするためにテストされた方法):最初の4バイトを読み取ろうとする小さなJava実装[0] [0] [1] [5]
:
byte[] read = new byte[4];
int length = 0;
while (length < read.length) {
len = iStream.read(read, len, read.length);
}
int ByteLength = (int)unsignedIntToLong(read);
ByteLength = ByteLength-5;
state = 1; // Continue and work with next data.
そして、ビット操作方法:
public long unsignedIntToLong(byte[] b)
{
long l = 0;
l |= b[0] & 0xFF;
l <<= 8;
l |= b[1] & 0xFF;
l <<= 8;
l |= b[2] & 0xFF;
l <<= 8;
l |= b[3] & 0xFF;
return l;
}
したがって、特定の何かを決定する前述の最初の 4 バイトをフェッチし、最後に の長さを見つけます465
。私の計画は、受信したデータの他のすべての部分でこのプロセスを繰り返すことです。