newfriendboy
newfriendboy
2015-08-04 07:20
采纳率: 0%
浏览 1.4k

这个代码对于这个数据包什么意思?它是怎么算出来的?

int splitFlag=0;
int splitNextFlag=0;
//int byteLength=1;
//int byteLengthTemp=newBytes[2]& 0xFF;
//byteLength=byteLengthTemp+2;
//boolean runFlag=true;
while(splitNextFlag<newBytes.length){
try {
splitFlag=splitNextFlag;//每次都更新读取的起始位置

            if(newBytes[splitFlag] != (byte)0xFF){
                throw new RuntimeException("设备"+recEntity.getDeviceId()+"接收数据异常,信息分组首字节不是FF : "+CommUtils2.toHexString(newBytes));

// throw new RuntimeException("接收数据异常,信息分组首字节不是FF:" + logMsg);

            }

            byte recFlag=newBytes[splitFlag+1]; //标识符位
            int byteLengthTemp=newBytes[splitFlag+2]& 0xFF;//车道字节所占长度
            int splitFlagTemp=splitFlag;

            splitNextFlag=splitFlagTemp+byteLengthTemp+4;//读取下条数据起始位置
            if(newBytes.length==170){
            switch (recFlag) {
            case 0x20:
                flowBytes2=ArrayUtils.subarray(newBytes, splitFlag,splitNextFlag);
                System.out.println("中车流量"+CommUtils2.toHexString(flowBytes2));
                break;
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • caozhy

    通过代码去理解数据包的格式,就好比根据脚印去推测人的长相一样。
    你应该优先去看文档、或者询问制定协议的人。

    点赞 评论
  • caozhy

    如果你实在没有文档,也找不到协议制定者,那么你也不是傻看代码,你应该尽量采集更多的数据包样本。
    同时尝试修改你的程序,对各种你不确定的地方做各种修改尝试,找出规律。

    点赞 评论
  • liqinghan
    john_liqinghan 2015-08-04 08:44

    根据协议来定义的数据包,开发者应该配合协议来查看代码! if(newBytes[splitFlag] != (byte)0xFF)该协议的开始码应该是0xff,
    至于后面的是什么以及该协议的长度是多少以及结束码、校验码等等都应该看协议。

    点赞 评论
  • liqinghan
    john_liqinghan 2015-08-04 08:45

    根据协议来定义的数据包,开发者应该配合协议来查看代码! if(newBytes[splitFlag] != (byte)0xFF)该协议的开始码应该是0xff,
    至于后面的是什么以及该协议的长度是多少以及结束码、校验码等等都应该看协议。

    点赞 评论
  • u011191259
    JuggLee 2015-08-04 10:05

    看你这代码,感觉数据最小包格式应该是:0xff(1byte头)+标识符(1byte)+该数据包有效字节长度(1byte)+有效数据(该数据包有效字节长度byte)+结束符(1byte)。然后代码里的“newBytes”应该是有可能包含多个这样的完整包。然后代码中意思就是“newBytes”的长度为170并且最小包标识符为0x20时,将该最小包数据的所有字节以十六进制打印出来。

    点赞 评论

相关推荐