100分求解电信网关(SMGP) MsgID 问题。

BingKinging 2014-07-01 06:05:31
关于接收到Submit_Resp 以及 Deliver 包 里面包含的MsgID 组成部分拆包,百思不得其解!
MsgID (摘抄协议部分如下)
   MsgId字段包含以下三部分内容:
   SMGW代码:3字节(BCD码)
    编码规则如下:
    3位区号(不足前添0)+2位设备类别+1位序号
    区号:所在省长途区号
    设备类别:SMGW取06
    序号:所在省的设备编码,例如第一个网关编号为1
   时间:4字节(BCD码),格式为MMDDHHMM(月日时分)
   序列号:3字节(BCD码),取值范围为000000~999999,从0开始,顺序累加,步长为1,循环使用。
   例如某SMGW的代码为010061,在2003年1月16日下午5时0分收到一条短消息,这条短消息的MsgID为:0x01006101161700012345,其中010061表示SMGW代码,01161700表示接收时间,012345表示消息序列号。

为此按照协议拆分:
1.根据以上三部分 3、4、3字节分别进行BCD解码,得到的结果后6位序列号,按照BCD8421的说法,不应该出现BCD非法编码,却出现16进制(非法)的数值
2.按照BCD8421的严格标准转码,也就是BCD编码低位在前的要求,那么得到的结果是每两位就交换了位置,例如,2014年7月1日15点30分,按照协议(smgp)应该是07011530,然而得到的结果确实70105103

求解,正确解码规则,要求能解码后否和协议规则,再次压缩能恢复到解码前。
...全文
231 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
BingKinging 2014-07-02
  • 打赏
  • 举报
回复
如果有同行,发几个MSGID截图也可以,顺带着把10个字节也发下!
BingKinging 2014-07-02
  • 打赏
  • 举报
回复
有没有哪位做过这个,贴出一串MSGID示例也号啊。。。。。
BingKinging 2014-07-02
  • 打赏
  • 举报
回复
byte[] bs = new Byte[] { 0, 39, 15, 6, 41, 9, 7, 10, 180, 107 }; //网关发过来的 string d1 = bs[0].ToString("X2") + bs[1].ToString("X2") + bs[2].ToString("X2"); string d2 = bs[3].ToString("X2") + bs[4].ToString("X2") + bs[5].ToString("X2") + bs[6].ToString("X2"); string d3 = bs[7].ToString("X2") + bs[8].ToString("X2") + bs[9].ToString("X2"); string result = d1+d2+d3; //结果result 显示的是:00270F062909070AB46B 和我另外一种方式得到的结果是一样的,就是里面含有A、B、C等16进制字样
tanta 2014-07-01
  • 打赏
  • 举报
回复
以事实为准,按实际情况检验。给的文档不一定正确。
tcmakebest 2014-07-01
  • 打赏
  • 举报
回复
无论文档写得对与错,事实才是最重要的,楼主这段数据,只要这么解析就行了: 转成16进制字符串,即: "01006101161700012345",按照3,2,1,8,6位拆分即是楼主需要的 010 06 1 01161700 012345

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧