开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2023|回复: 2
收起左侧

[已解决] CRC16 C语言源码或VB语言源码转易语言---自己已找到解决方法--申请取消悬赏

[复制链接]
结帖率:0% (0/1)
发表于 2018-9-3 23:45:28 | 显示全部楼层 |阅读模式   山西省运城市
100精币
本帖最后由 gxlm2001 于 2018-9-4 23:07 编辑

校验内容一 ST=32;CN=2011;PW=123456;MN=0873HHMZWSLH02;CP=&&DataTime=20160103133030;060-Rtd=3.0943,060-Flag=N;011-Rtd=18.0412,011-Flag=N;001-Rtd=8.2137,001-Flag=N;B01-Rtd=10.9890,B01-Flag=N&&
CRC16校验码为 A9C1


校验内容二 ST=31;CN=2011;PW=123456;MN=00000000000001;CP=&&DataTime=20180903162933;S01-Rtd=6.546142;02-Rtd=48.01542;03-Rtd=119.6738;S05-Rtd=22.7324;gasPress-Rtd=86.56911;Alarm=&&
CRC16校验码为 3a15




C语言代码一
函数        CRC16_Checkout
描述        CRC16循环冗余校验算法
参数一        *puchMsg 需要校验的字符串指针
参数二        usDataLen 需要校验的字符串长度
返回值        返回CRC16校验码
unsigned int CRC16_Checkout(unsigned char *puchMsg,unsigned int usDataLen)
{
        unsigned int i,j,crc_reg,check;


        crc_reg=0*FFFF;
        for(i=0;i<usDataLen;i++)
        {
                crc_reg=(crc_reg>>8)^puchMsg;
                for(j=0;j<8;j++)
                {
                        check=crc_reg & 0*0001;
                        crc_reg>>=1;
                        if(check == 0*0001)
                        {
                                crc_reg ^= 0*A001;
                        }
                }
        }
        return crc_reg;
}



C语言代码二
unsigned int CRC16_Checkout(unsigned char *puchMsg,unsigned int usDataLen)
{
        unsigned int i,j,crc_reg,check;

        crc_reg=0*FFFF;
        for(i=0;i<usDataLen;i++)
        {
                crc_reg=(crc_reg>>8)^puchMsg;
                for(j=0;j<8;j++)
                {
                        check=crc_reg & 0*0001;
                        crc_reg>>=1;
                        if(check == 0*0001)
                        {
                                crc_reg ^= 0*A001;
                        }
                }
        }
        return crc_reg;
}


VB代码
Function CRC16(data() As Byte) As Long
    Dim r As Long
    Dim hi As Byte
    Dim flag As Byte
    Dim i As Long
    Dim j As Long
   
    r = &HFFFF&
    For j = 0 To UBound(data)
        hi = r \ &H100&
        hi = hi Xor data(j)
        r = hi
        
        For i = 1 To 8
            flag = r And 1
            r = r \ 2
            If flag = 1 Then
                r = r Xor &HA001&
            End If
        Next
    Next
    CRC16 = r
End Function


Sub Main()
    Dim s As String
    Dim a() As Byte
    s = "ST=32;CN=2011;PW=123456;MN=0873HHMZWSLH02;CP=&&DataTime=20160103133030;060-Rtd=3.0943,060-


Flag=N;011-Rtd=18.0412,011-Flag=N;001-Rtd=8.2137,001-Flag=N;B01-Rtd=10.9890,B01-Flag=N&&"
   
    a = StrConv(s, vbFromUnicode)
    Debug.Print Hex(CRC16(a))
End Sub



以上3个源代码均能校验 其中一种转成易语言即可

评分

参与人数 1精币 +2 收起 理由
onlydbg + 2 看看哪位大大这么好心

查看全部评分


求助知识:请将问题描述清楚,最好把你有问题的源码打包上传上来,这样更方便大家帮助你。
友情提醒:本版被采纳的主题可在 申请荣誉值 帖子申请荣誉值,获得 3点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
结帖率:0% (0/1)
 楼主| 发表于 2018-9-4 16:50:09 | 显示全部楼层   山西省运城市
http://www.ip33.com/crc.html  CRC(循环冗余校验)在线计算

结合下面两个贴子解决
https://bbs.125.la/forum.php?mod ... amp;highlight=crc16
https://bbs.125.la/forum.php?mod ... amp;highlight=crc16

先把字符串转成字节集
再转成十六进制或整数数组

100字节
第一种方法 90ms
第二种查表法  0ms
在此感谢两位大神的无私分享精神
回复

使用道具 举报

发表于 2018-9-15 11:52:34 | 显示全部楼层   广东省广州市
讲了几天基础课了         后面就要来真技术了     快点来加入哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表