我正在做一个需要通过 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(++)。
编辑(测试将数据报的每个部分复制到结构中的方法):小型 Java 实现,我尝试读取前 4 个字节[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
. 我的计划是对接收到的数据的所有其他部分重复此过程。