Re: [问题] 一长串资料解析

楼主: mars90226 (火星人)   2015-05-12 14:45:53
※ 引述《JGC18 (JGC)》之铭言:
: 各位先进好:
: 小弟今天有一台设备,假设回应资料的长度会有,250bytes, 120bytes, 60bytes
: 这250bytes,假设依照规格总共可以解析出10个字段(字段编号为A,B,C,D,E,F,G,H,I,J)
: 120bytes,可以解析出6个字段(字段编号为 A,D,E,F,I,J)
: 60bytes,可以解析出3个字段 (字段编号为 B,C,D)
: 250个bytes等于是完整的所有资料回复
: 如果有错误,就是回应120bytes跟60bytes
: 我目前想到的方法是用一个class类似这样
: Public Class DataParser{
: private byte[] a= new byte[10];
: private byte[] b= new byte[5];
: private byte[] c= new byte[3];
: ....//以此类推新增到 j
: private byte[] j= new byte[5];
: public void parse(byte[] data){
: if(长度为250){
: //解析到10个字段中, a,b,c,d,e,f,g,h,i,j
: } else if(长度为120) {
: //解析到6个字段中
: } else if (长度为60) {
: //解析到3个字段中
: } else {//error, 未知长度}
: }
: public byte[] getA(){ return a;}
: public byte[] getB(){ return b;}
: ....
: public byte[] getJ(){ return j;}
: }
: 这是我目前想到最直觉得方法
: 但是实际上可能我的字段不止10个
: 可能会达到50个以上,接收要解析的资料长度,最大不会超过300bytes
: 但这样的方式是否会有太多byte array的变量,使用太多内存呢
: 不知道是不是有其它思考的方向可以提供给我做参考
: 感谢
不如把这三种状况的资料都拉出来变成class
例如:
class Packet {
// getters and setters
}
class LongPacket extends Packet {
private byte[] a = new byte[10];
private byte[] b = new byte[5];
private byte[] c = new byte[3];
...
private byte[] j = new byte[5];
public LongPacket(byte[] packet) {
// parse packet
}
}
class MediumPacket extends Packet {
// similar to LongPacket, but with fewer fields
}
class ShortPacket extends Packet {
// similar to MediumPacket, but with fewer fields
}
public class DataParser {
private Packet packet;
public void parse(byte[] data) {
if (data.length == 250) {
packet = new LongPacket(data);
} else if (data.length == 120) {
packet = new MediumPacket(data);
} else if (data.length == 60) {
packet = new ShortPacket(data);
} else {
// error
}
}
}
大概像这样子处理,详细parse的步骤就交给各Packet class去做
这样未来如果有新增不同长度的packet也可以靠新增class去处理

Links booklink

Contact Us: admin [ a t ] ucptt.com