『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 4527|回复: 6

[流程系列] 小白第一个求助帖

[复制链接]

6

主题

94

帖子

2228

积分

金牌会员

Rank: 6Rank: 6

积分
2228
金钱
2134
HASS币
0
发表于 2021-9-11 10:04:14 | 显示全部楼层 |阅读模式
请问群里大佬,一个buffer需要参与CRC16校验,然后再输出新的buffer,

例如,new Bufrer = [0xFE,0x05,0x00,0x00,0xFF,0x00],

CRC16校验函数如下:
var CRCMaster = {
    StringToCheck: "",
    CleanedString: "",
    CRCTableDNP: [],
    init: function() {
        this.CRCDNPInit();
    },
    CleanString: function(inputType) {
        if (inputType == "ASCII") {
            this.CleanedString = this.StringToCheck;
        } else {
            if (this.StringToCheck.match(/^[0-9A-F \t]+$/gi) !== null) {
                this.CleanedString = this._hexStringToString(this.StringToCheck.toUpperCase().replace(/[\t ]/g, ''));
            } else {
                window.alert("String doesn't seem to be a valid Hex input.");
                return false;
            }
        }
        return true;
    },
    CRCDNPInit: function() {
        var i, j, crc, c;
        for (i = 0; i < 256; i++) {
            crc = 0;
            c = i;
            for (j = 0; j < 8; j++) {
                if ((crc ^ c) & 0x0001) crc = (crc >> 1) ^ 0xA6BC;
                else crc = crc >> 1;
                c = c >> 1;
            }
            this.CRCTableDNP[i] = crc;
        }
    },
    CRC16Modbus: function() {
        var crc = 0xFFFF;
        var str = this.CleanedString;
        for (var pos = 0; pos < str.length; pos++) {
            crc ^= str.charCodeAt(pos);
            for (var i = 8; i !== 0; i--) {
                if ((crc & 0x0001) !== 0) {
                    crc >>= 1;
                    crc ^= 0xA001;
                } else
                    crc >>= 1;
            }
        }
        return crc;
    },
    _stringToBytes: function(str) {
        var ch, st, re = [];
        for (var i = 0; i < str.length; i++) {
            ch = str.charCodeAt(i); // get char
            st = []; // set up "stack"
            do {
                st.push(ch & 0xFF); // push byte to stack
                ch = ch >> 8; // shift value down by 1 byte
            }
            while (ch);
            // add stack contents to result
            // done because chars have "wrong" endianness
            re = re.concat(st.reverse());
        }
        // return an array of bytes
        return re;
    },
    _hexStringToString: function(inputstr) {
        var hex = inputstr.toString(); //force conversion
        var str = '';
        for (var i = 0; i < hex.length; i += 2)
            str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
        return str;
    },
    Calculate: function(str, inputType) {
        this.StringToCheck = str;
        if (this.CleanString(inputType)) {
            crcinputcrc16modbus=this.CRC16Modbus().toString(16).toUpperCase();
            crcinputcrc16modbus=crcinputcrc16modbus.substr(2) + crcinputcrc16modbus.substr(0, 2); //swap bytes

        }
    }
};

CRCMaster.init();

var inputType = "HEX";
var crcinputcrc16modbus;
var crcinput = msg.payload;

CRCMaster.Calculate(crcinput, inputType);

msg.payload = crcinput + crcinputcrc16modbus;

return msg;

请问怎样将结果最后输出为:new Buffer = [0xFE,0x05,0x00,0x00,0xFF,0x00,0x98,0x35]?


回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

发表于 2021-9-11 10:12:53 来自手机 | 显示全部楼层
能问出这样的问题,你还好意思自称小白???
回复

使用道具 举报

6

主题

94

帖子

2228

积分

金牌会员

Rank: 6Rank: 6

积分
2228
金钱
2134
HASS币
0
 楼主| 发表于 2021-9-11 10:25:13 | 显示全部楼层
本帖最后由 jhbl 于 2021-9-11 10:26 编辑

昨晚还看了一个帖子里你回答一个新手说的:你太懒了!
网上的教程文章示例多如牛毛,怎么可能找不到!
有个网友回了句:何不食肉糜……


回复

使用道具 举报

13

主题

220

帖子

644

积分

高级会员

Rank: 4

积分
644
金钱
422
HASS币
0
发表于 2021-9-11 16:30:08 | 显示全部楼层
牛逼啊,我更新手了,一个代码都看不懂
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

发表于 2021-9-11 17:40:30 | 显示全部楼层
jhbl 发表于 2021-9-11 10:25
昨晚还看了一个帖子里你回答一个新手说的:你太懒了!
网上的教程文章示例多如牛毛,怎么可能找不到!
有个 ...

你竟然没看出来我那句话是夸你的么?

说实话,感觉你的问题很高深、远不是小白会想到、会碰到甚至会想解决的问题。

闲聊&帮顶,你的问题我是没能力帮上别的啥忙,太难了。
回复

使用道具 举报

6

主题

94

帖子

2228

积分

金牌会员

Rank: 6Rank: 6

积分
2228
金钱
2134
HASS币
0
 楼主| 发表于 2021-9-11 22:07:27 | 显示全部楼层
XCray 发表于 2021-9-11 17:40
你竟然没看出来我那句话是夸你的么?

说实话,感觉你的问题很高深、远不是小白会想到、会碰到甚至会想解 ...

不好意思,理解错误,请多包涵!其实那个CRC函数校验是一个节点,我copy下来的,我需要前面的buffer通过这个CRC函数运算之后输出两个字节的校验码,然后和原来的buffer合并在一起就是我想要输出的结果。这个问题的难点是数组需要转换为字符串来参与CRC函数运算,然后输出一段字符串,最后还需要把这段输出的字符串转为16进制数据,我是不懂编程,所以才会发帖请教大佬。
回复

使用道具 举报

32

主题

1065

帖子

4942

积分

论坛元老

Rank: 8Rank: 8

积分
4942
金钱
3862
HASS币
90
发表于 2021-10-7 05:14:32 | 显示全部楼层
jhbl 发表于 2021-9-11 22:07
不好意思,理解错误,请多包涵!其实那个CRC函数校验是一个节点,我copy下来的,我需要前面的buffer通过 ...

呵呵。建议copy到stackoverflow了,然后被一堆大佬教你怎么问问题。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-21 22:09 , Processed in 0.309523 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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