从香港数据源接收到的是一串16进制串,接收方法如下: public void messageReceived(IoSession session, Object message)
throws Exception {
ByteBuffer buf = (ByteBuffer) message;
StringBuffer strBuff = new StringBuffer();
while(buf.hasRemaining()){
strBuff.append((char)buf.get());
}
System.out.println(strBuff);
} message 为接收到的对象,message与buf打印出来如下: buf=DirectBuffer[pos=0 lim=55 cap=8192: 02 11 0f 01 00 eb b0 55 4b 31 32 33 34 35 00 00 1c 35 1d 53
50 4f 54 5f 46 58 5f 45 55 52 4a 50 59 1e 32 32 1f 31 35 37
2e 30 36 1e 32 35 1f 31 35 37 2e 30 36 31 1c 03 41 71] 每个接收到的数据串包含若干个数据包(上面的例子刚好只有一个数据包),依据给定的数据格式,上条数据包解析如下: 02 -------STX(正文开始,1字节)
11 -------Application Data(这是应用数据,1字节)
0f -------Header Length(包头的长度,1字节)
01 -------Application ID(ID号,1字节)
00 -------Variable Length Packet(包可变部分长度,1字节)
eb b0 ----Sequence Number B0EB(消息序列号,以1递增,2字节)
55 4b 31 32 33 34 35 00 00-------Reserved Bytes(保留字节,9字节) ===============================以上部分可以认为是包头=========================================================== 1c 35 1d --------Symbol to Follow(标志位,指示下面开始为symbol,3字节)
53 50 4f 54 5f 46 58 5f 45 55 52 4a 50 59 ------“SPOT_FX_EURJPY”(symbol,用字符型从bytebuffer读取出来,不定长)
1e -------Field ID to Follow(标志位,指示下面为字段名代码,1字节)
32 32 ---------“22” (Field ID for Bid)(22,用ASC码读取出来,22代表字段名为Bid)
1f ----------Field ID Termination(标志位,指示下面为字段值,1字节)
31 35 37 2e 30 36 -----------“157.06”(不定长,以下是“1E字段名1F字段值”.....循环若干个)
1e ----------Field ID to Follow
32 35 -----------“25” (Field ID for Ask)
1f ------------Field ID Termination
31 35 37 2e 30 36 31 ---------“157.061” ================================以上部分可以认为是包体(既数据部分),下面为包尾============================================ 1c 03----------- End of Message and ETX(正文结束,1字节)
41 71------------ <FCS1> <FCS2> Frame Check(帧校对,2字节)
如果该串全部是单一类型的,比较好解析,只要用buf.getchar()等方法原样读取出来即可,
现在问题是这个包里有好多个类型,所以要做的工作如下: 1、把数据串按一个个数据包分割开来,以02为分割点。
2、对每个数据包再进行分割,对相应位置的串按相应格式get出来。 小弟才疏学浅,只知道把该串转成string后用split进行分割,这个是可以实现的,但是分割成string后的字段名、字段值想让它再转成bytebuffer,
好用get()方法按相应格式取出,可就是转不过来,请教各位XDJM,有什么办法转?或则依据这个串格式,有没有更便捷的解析方法? 小弟在这跪谢啦! PS:1)我是用这个方法get的 String[] temp = buf.getHexDump().split("02");
getHexDump()是mina框架里的方法,返回的结果是string,值是“02 11 0f 01 00 eb b0......” 2)string转成bytebuffer我试过这个方法:ByteBuffer buf= ByteBuffer.wrap(string.getBytes());
可以转,但是转完,再get出来:
StringBuffer symbol = new StringBuffer();
while(buf.hasRemaining()){
symbol.append((char)buf.get());
}
symbol的值与string是一样的,白转换了。
throws Exception {
ByteBuffer buf = (ByteBuffer) message;
StringBuffer strBuff = new StringBuffer();
while(buf.hasRemaining()){
strBuff.append((char)buf.get());
}
System.out.println(strBuff);
} message 为接收到的对象,message与buf打印出来如下: buf=DirectBuffer[pos=0 lim=55 cap=8192: 02 11 0f 01 00 eb b0 55 4b 31 32 33 34 35 00 00 1c 35 1d 53
50 4f 54 5f 46 58 5f 45 55 52 4a 50 59 1e 32 32 1f 31 35 37
2e 30 36 1e 32 35 1f 31 35 37 2e 30 36 31 1c 03 41 71] 每个接收到的数据串包含若干个数据包(上面的例子刚好只有一个数据包),依据给定的数据格式,上条数据包解析如下: 02 -------STX(正文开始,1字节)
11 -------Application Data(这是应用数据,1字节)
0f -------Header Length(包头的长度,1字节)
01 -------Application ID(ID号,1字节)
00 -------Variable Length Packet(包可变部分长度,1字节)
eb b0 ----Sequence Number B0EB(消息序列号,以1递增,2字节)
55 4b 31 32 33 34 35 00 00-------Reserved Bytes(保留字节,9字节) ===============================以上部分可以认为是包头=========================================================== 1c 35 1d --------Symbol to Follow(标志位,指示下面开始为symbol,3字节)
53 50 4f 54 5f 46 58 5f 45 55 52 4a 50 59 ------“SPOT_FX_EURJPY”(symbol,用字符型从bytebuffer读取出来,不定长)
1e -------Field ID to Follow(标志位,指示下面为字段名代码,1字节)
32 32 ---------“22” (Field ID for Bid)(22,用ASC码读取出来,22代表字段名为Bid)
1f ----------Field ID Termination(标志位,指示下面为字段值,1字节)
31 35 37 2e 30 36 -----------“157.06”(不定长,以下是“1E字段名1F字段值”.....循环若干个)
1e ----------Field ID to Follow
32 35 -----------“25” (Field ID for Ask)
1f ------------Field ID Termination
31 35 37 2e 30 36 31 ---------“157.061” ================================以上部分可以认为是包体(既数据部分),下面为包尾============================================ 1c 03----------- End of Message and ETX(正文结束,1字节)
41 71------------ <FCS1> <FCS2> Frame Check(帧校对,2字节)
如果该串全部是单一类型的,比较好解析,只要用buf.getchar()等方法原样读取出来即可,
现在问题是这个包里有好多个类型,所以要做的工作如下: 1、把数据串按一个个数据包分割开来,以02为分割点。
2、对每个数据包再进行分割,对相应位置的串按相应格式get出来。 小弟才疏学浅,只知道把该串转成string后用split进行分割,这个是可以实现的,但是分割成string后的字段名、字段值想让它再转成bytebuffer,
好用get()方法按相应格式取出,可就是转不过来,请教各位XDJM,有什么办法转?或则依据这个串格式,有没有更便捷的解析方法? 小弟在这跪谢啦! PS:1)我是用这个方法get的 String[] temp = buf.getHexDump().split("02");
getHexDump()是mina框架里的方法,返回的结果是string,值是“02 11 0f 01 00 eb b0......” 2)string转成bytebuffer我试过这个方法:ByteBuffer buf= ByteBuffer.wrap(string.getBytes());
可以转,但是转完,再get出来:
StringBuffer symbol = new StringBuffer();
while(buf.hasRemaining()){
symbol.append((char)buf.get());
}
symbol的值与string是一样的,白转换了。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货