免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5197 | 回复: 10
打印 上一主题 下一主题

SMP协议校验码生成 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-01 16:31 |只看该作者 |倒序浏览
本帖最后由 yearn4fd 于 2014-09-02 14:11 编辑

今天做smp协议的接口,细读了一下协议,大部分都能理解,但校验码这块百思不得其解。
协议中校验码的获取办法是这么定义的:

"16进制字符(0-F)表示的32位整数(8B)。
校验和的算法如下:对“消息头+会话头+事务头+操作信息”按32位异或,对异或结果取反后的值为校验和。比如 F688ECC4 "

比如:消息串是'`SC`00581.00IN123456    SRVM00000001DLGLGNFFFF00000001TXBEG 00FFLOGIN:USER=admin,PSWD=adminjjyy‘
其中:
消息头:'1.00ZJ123456    SRVM'
会话头:'00000001DLGLGNFFFF'
事务头:'00000001TXBEG 00FF'
操作信息:'LOGIN:USER=admin,PSWD=adminjjyy'

要转为:
'`SC`00581.00IN123456    SRVM00000001DLGLGNFFFF00000001TXBEG 00FFLOGIN:USER=admin,PSWD=adminjjyy‘ +校验码

这个校验码是如何出来的?
我无法理解的是:这几个东西都是字符串,如何加法?是转为什么格式后再相加?perl有什么办法处理。

消息的具体组成及发送顺序是这样:
校验码  操作信息  事务头 会话头  消息头   消息长度  消息开始标识
<<<<<<<<<<<<<<<<<<<<消息发送顺序<<<<<<<<<<<<<<<<<
其中校验码 放在屁股,最后发送,如果校验码不对,服务端拒绝接入。

论坛徽章:
0
2 [报告]
发表于 2014-09-01 17:07 |只看该作者
本帖最后由 sjdy521 于 2014-09-01 17:10 编辑

字符串加法就是简单的字符串拼接
按32位异或,即4字节一组,依次异或
在perl里字符串拼接用点号(.)
字符串按二进制异或操作用pack()和操作符^

论坛徽章:
0
3 [报告]
发表于 2014-09-01 17:18 |只看该作者
可能不是这么理解。因为”校验码固定为8BYTE“。如果仅是简单的拼接,因为操作信息不可能为固定长度,长短不一。。。那校验码长度是固定不了的,很费解呀。

sjdy521 发表于 2014-09-01 17:07
字符串加法就是简单的字符串拼接
按32位异或,即4字节一组,依次异或
在perl里字符串拼接用点号(.)

论坛徽章:
0
4 [报告]
发表于 2014-09-01 17:58 |只看该作者
回复 3# yearn4fd


    长度不固定可以补齐,具体看协议要求了

论坛徽章:
0
5 [报告]
发表于 2014-09-01 21:52 |只看该作者
本帖最后由 yearn4fd 于 2014-09-02 13:59 编辑

按上面给出的范串,那几个串(.)操作完再4字节分组,哪里止有8组?
$message='1.00IN123456    SRVM00000001DLGLGNFFFF00000001TXBEG 00FFLOGIN:USER=admin,PSWD=adminjjyy';
#$ms=~s/\s/0/g;
$m=int(length($message)/4);
$n=length($message)%4;
$m++ if($n>0);
my @ar;
for ($i=0;$i<$m;$i++)
{ $ar[$i]=substr($message,4*$i,4);}
foreach (@ar)
{print $_."\n";}

1.00
IN12
3456

SRVM
0000
0001
DLGL
GNFF
FF00
0000
01TX
BEG
00FF
LOGI
N:US
ER=a
dmin
,PSW
D=ad
minj
jyy


我还是糊涂不明白。
回复 4# sjdy521


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2014-09-02 09:22 |只看该作者
本帖最后由 jason680 于 2014-09-02 09:39 编辑

回复 1# yearn4fd

$ cat FILE
1.00IN123456    SRVM00000001DLGLGNFFFF00000001TXBEG 00FFLOGIN:USER=admin,PSWD=adminjjyy

$ hexdump -C FILE
00000000  31 2e 30 30 49 4e 31 32  33 34 35 36 20 20 20 20  |1.00IN123456    |
00000010  53 52 56 4d 30 30 30 30  30 30 30 31 44 4c 47 4c  |SRVM00000001DLGL|
00000020  47 4e 46 46 46 46 30 30  30 30 30 30 30 31 54 58  |GNFFFF00000001TX|
00000030  42 45 47 20 30 30 46 46  4c 4f 47 49 4e 3a 55 53  |BEG 00FFLOGIN:US|
00000040  45 52 3d 61 64 6d 69 6e  2c 50 53 57 44 3d 61 64  |ER=admin,PSWD=ad|
00000050  6d 69 6e 6a 6a 79 79 0a                           |minjjyy.|
00000058


8位
00000000  31 2e 30 30 49 4e 31 32  33 34 35 36 20 20 20 20  |1.00IN123456    |

32位
00000000  31 2e 30 30 49 4e 31 32  33 34 35 36 20 20 20 20  |1.00IN123456    |
   

论坛徽章:
0
7 [报告]
发表于 2014-09-02 10:57 |只看该作者
本帖最后由 yearn4fd 于 2014-09-02 10:58 编辑

$message='1.00IN123456    SRVM00000001DLGLGNFFFF00000001TXBEG 00FFLOGIN:USER=admin,PSWD=adminjjyy';
#$ms=~s/\s/0/g;
$m=int(length($message)/4);
$n=length($message)%4;
$m++ if($n>0);
my @my_array;
for ($i=0;$i<$m;$i++)
{ $my_array[$i]=substr($message,4*$i,4);}
foreach (@my_array)
{print $_."\n";}

1.00
IN12
3456

SRVM
0000
0001
DLGL
GNFF
FF00
0000
01TX
BEG
00FF
LOGI
N:US
ER=a
dmin
,PSW
D=ad
minj
jyy

现在我不理解的是 几个”头“及”操作信息“加起来,按32位异或。然后取反
难道是:

foreach (@my_array)
{ $_=$_. ' ' x (4-length($_)) if (length($_)<4); }  #我自己想当然的对不满4位的分组在其后加上空格

my $ret;
foreach( @my_array) #@my_array中是以上信息“."操作后,按4位一分组获得的数组。
{
print $_."\n";
$ret=$ret^$_; #依次异或}
$ret=~$ret;
print unpack("H32",$ret);
奇怪的是取得的结果服务端通不过。
回复 6# jason680


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2014-09-02 11:23 |只看该作者
回复 7# yearn4fd

>>现在我不理解的是 几个”头“及”操作信息“加起来,按32位异或。然后取反...

code是按你理解写出来的
不懂/不理解....别写code

先问自已...
什么是32位?(又如何取32位,不足如何补...)
什么是异或?
什么是取反?


如果都无法懂/理解....

乱写code有何用呢?
   

-----------------------------

http://www.doc88.com/p-17616426671.html

please refer the page 7 and 8 if you can know the C code

论坛徽章:
0
9 [报告]
发表于 2014-09-02 11:50 |只看该作者
本帖最后由 yearn4fd 于 2014-09-02 11:51 编辑

这种协议本身就别人给你一个文档(网上都有),给文档的人自己也不清楚。只能自己试。或是找他人指点。
哎,没办法的事。
回复 8# jason680


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2014-09-02 12:20 |只看该作者
回复 9# yearn4fd

It's up to you and good luck for you
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP