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