fix协议封装挑战-工具类

原创 2013年12月03日 12:43:20

MsgUtil:

 /*
     * @headerAndBody 包含消息头+消息体,包含SOH,不包含checksum域
     */
    public static String checkSum(String headerAndBody) {
        byte[] headerAndBodyBytes = headerAndBody.getBytes();
        
        int sum = 0;

        for (byte b : headerAndBodyBytes) {
            sum += b;
        }

        String rt = String.valueOf((sum) % 256);

        /*
         * 在模256之后需要转换成固定长度为3字符串
         */
        if (rt.length() == 1) {
            rt = "00" + rt;
        } else if (rt.length() == 2) {
            rt = "0" + rt;
        } else {
        }

        return rt;
    }
    
    public static String getGMTTime(){
        SimpleDateFormat foo = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS", Locale.ENGLISH);
        foo.setTimeZone(TimeZone.getTimeZone("GMT"));
        return foo.format(new Date());
    }
    
    public static String[] seperate(String msgStr){
    	String[] tags=msgStr.split(BaseMsg.SOH);
    	List<Integer> seqHead=new ArrayList<Integer>();
    	List<Integer> seqTailer=new ArrayList<Integer>();
    	int indexHead=0;
    	int indexTail=0;
    	boolean firstTail=true;
    	if(tags.length<5){
    		throw new InValidDataException("消息格式错误");
    	}else{
    			String tag=tags[0];
        		String [] ts=tag.split("=");
        		if(ts.length!=2){
        			throw new InValidDataException("消息格式错误");
        		}
        		String tagId=ts[0];
        		if(!tagId.equals("8")){
        			throw new InValidDataException("消息格式错误");
        		}
        		String tag1=tags[1];
        		String [] ts1=tag1.split("=");
        		if(ts1.length!=2){
        			throw new InValidDataException("消息格式错误");
        		}
        		String tagId1=ts1[0];
        		if(!tagId1.equals("9")){
        			throw new InValidDataException("消息格式错误");
        		}
        		String tag2=tags[2];
        		String [] ts2=tag2.split("=");
        		if(ts2.length!=2){
        			throw new InValidDataException("消息格式错误");
        		}
        		String tagId2=ts2[0];
        		if(!tagId2.equals("35")){
        			throw new InValidDataException("消息格式错误");
        		}
        		String tag3=tags[tags.length-1];
        		String [] ts3=tag3.split("=");
        		if(ts3.length!=2){
        			throw new InValidDataException("消息格式错误");
        		}
        		String tagId3=ts3[0];
        		if(!tagId3.equals("10")){
        			throw new InValidDataException("消息格式错误");
        		}
    	}
    	
    	for(int i=0;i<tags.length;i++){
    		String tag=tags[i];
    		String [] ts=tag.split("=");
    		if(ts.length!=2){
    			throw new InValidDataException("消息格式错误");
    		}
    		String tagId=ts[0];
    		if(allHead.contains(tagId)){
    			seqHead.add(i);
    			indexHead=i;
    		}
    		if(allTailer.contains(tagId)){
    			seqTailer.add(i);
    			if(firstTail){
    				indexTail=i;
    			}
    			firstTail=false;
    		}
    	}
    	for(int i=0;i<seqHead.size()-1;i++){
    		if(seqHead.get(i+1)-seqHead.get(i)!=1){
    			throw new InValidDataException("消息格式错误");
    		}
    	}
    	for(int i=0;i<seqTailer.size()-1;i++){
    		if(seqTailer.get(i+1)-seqTailer.get(i)!=1){
    			throw new InValidDataException("消息格式错误");
    		}
    	}
    	int index=0;
    	indexHead++;
        while(indexHead-->0){
        	index=msgStr.indexOf("=", index+1);
        }
        index=msgStr.indexOf(BaseMsg.SOH, index);
        String head=msgStr.substring(0, index+1);
        int indexT=0;
        while(indexTail-->0){
        	indexT=msgStr.indexOf("=",indexT+1);
        }
        indexT=msgStr.indexOf(BaseMsg.SOH, indexT);
        String tailer=msgStr.substring(indexT+1);
        String body=msgStr.substring(index+1, indexT+1);
        String[]sep=new String[3];
        sep[0]=head;
        sep[1]=body;
        sep[2]=tailer;
        return sep;
    }

checkSum计算10的值,
seperate将消息,分割为头,体,尾

版权声明:本文为博主原创文章,未经博主允许不得转载。

fix协议封装挑战-测试代码

初步测试工具采用香港证券交易所的一个离线测试工具,测试数据包正确性。 工具名称叫做OCG Simulator 1.2.1。 测试代码比如: TC_QM_03测试案例: package cs.t...
  • hxpjava1
  • hxpjava1
  • 2013年12月03日 12:38
  • 1212

fix协议封装挑战

最近在做金融项目,用到了fix协议,是么是fix协议我就不多说了,由我一个人去封装这个庞然大物,当然很多没用到的我们暂时没封装进去。 下面是我的思路。 msg由个基类BaseMsg compon...
  • hxpjava1
  • hxpjava1
  • 2013年12月02日 17:04
  • 5274

fix协议封装挑战-ClientHandlerFactory&ClientMessageHandler

package cs.mina.client.handler; import java.util.HashMap; import java.util.Map; /* *@author(huang...
  • hxpjava1
  • hxpjava1
  • 2017年07月11日 09:17
  • 115

fix协议封装挑战-DbFail

package cs.mina.client.handler; import java.io.Serializable; import java.util.concurrent.locks.Lock...
  • hxpjava1
  • hxpjava1
  • 2017年07月11日 09:20
  • 123

fix协议封装挑战-DbFailExecuteThreadHandler

package cs.mina.client.handler; import java.text.SimpleDateFormat; import java.util.Calendar; impor...
  • hxpjava1
  • hxpjava1
  • 2017年07月11日 09:21
  • 163

Fix协议封装挑战-消息处理

消息处理还没正式开始写,有待完善: 处理器工厂如下: package cs.mina.client.handler; import java.util.HashMap; import java....
  • hxpjava1
  • hxpjava1
  • 2013年12月03日 12:40
  • 903

fix协议封装挑战-BusinessMessageRejectMessageHandler

package cs.mina.client.handler; import java.util.Calendar; import java.util.Date; import java.util....
  • hxpjava1
  • hxpjava1
  • 2017年07月11日 09:15
  • 151

fix协议介绍-常用资源

最终要的资料就是规范了: http://old.fixprotocol.org/FIXimate3.0/latestEP/    这个是最新规范的web版,消息结构 http://www.f...
  • hxpjava1
  • hxpjava1
  • 2013年12月03日 12:49
  • 1334

fix协议封装挑战-将消息字符串解析为实体

这个是真正的有挑战的,我的方法还是递归解析。 举个例子: 比如下面返回消息: 响应: 8=FIXT.1.1_9=239_35=8_49=HKEXCO_56=CO99999901_34=3_52=...
  • hxpjava1
  • hxpjava1
  • 2013年12月03日 11:58
  • 1368

QuickFix Fix协议实现配置(一)

Fix协议,有现成的QuickFix,拿来就可以用,不过要上手也要了解一下FIX协议,入手: settings_ = new FIX::SessionSettings(p.s...
  • niying
  • niying
  • 2016年12月21日 15:34
  • 1316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fix协议封装挑战-工具类
举报原因:
原因补充:

(最多只允许输入30个字)