【物联网开发】、【小程序蓝牙通讯数据校验】JS CRC-16-MODBUS 验证 高位在前地位在后;JS异或校验;16进制字符串和float互转

本文主要是介绍【物联网开发】、【小程序蓝牙通讯数据校验】JS CRC-16-MODBUS 验证 高位在前地位在后;JS异或校验;16进制字符串和float互转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.CRC校验

/*计算CRC-16/MODBUS校验位高低位*/
function calculateCRC16Modbus(dataHexString) {const dataBytes = [];for (let i = 0; i < dataHexString.length; i += 2) {dataBytes.push(parseInt(dataHexString.substr(i, 2), 16));}let crc = 0xFFFF;const polynomial = 0xA001; // This is the polynomial x^16 + x^15 + x^2 + 1for (const byte of dataBytes) {crc ^= byte;for (let i = 0; i < 8; i++) {if (crc & 0x0001) {crc = ((crc >> 1) ^ polynomial) & 0xFFFF;} else {crc >>= 1;}}}crc = pad(crc.toString(16).toUpperCase(),4);//补0(不然会出八阿哥)let crcArr = new Array(2)console.log('crc='+crc)crcArr[0] = crc.substring(2, 4)crcArr[1] = crc.substring(0, 2)let code = crcArr[0] + crcArr[1]return code
}

2.异或校验

// 生成校验码
function genCheckCode(msgBodyCode) {let firstByte = null;for (let i = 0; i < msgBodyCode.length; i = i + 2) {const curCode = '0x' + msgBodyCode.substring(i, i + 2);if (i == 0) {firstByte = curCode} else {firstByte = firstByte ^ curCode}}firstByte = parseInt(firstByte)const codePad = pad(firstByte.toString(16), 2)console.log('校验码==' + codePad)return codePad;
}

3.pad 左侧补0方法

// 左侧补齐0
function pad(str, max) {str = str.toString();return str.length < max ? pad("0" + str, max) : str;
}

4.16进制和float(4字节)互转

/*4字节byte十六进制转浮点数      解析   */
function hex2float(hexString, precision) {//hex2float('EC519A44', 2))precision = parseInt(precision)if (isNaN(precision) || precision < 0) {precision = 2}// 高低位转换const byteArray = [];for (let i = 0; i < hexString.length; i += 2) {byteArray.unshift(hexString.substr(i, 2));}// 创建一个包含十六进制数的 ArrayBufferconst hexValue = '0x' + byteArray.join('');const buffer = new ArrayBuffer(4);const dataView = new DataView(buffer);dataView.setUint32(0, hexValue, false);// 从 DataView 中读取浮点数const floatValue = dataView.getFloat32(0, false);return floatValue.toFixed(precision);
}/*浮点数转4字节十六进制      发送*/
function float2hex(floatNumber) {// 创建一个 4 字节的 ArrayBufferconst buffer = new ArrayBuffer(4);// 使用 DataView 来操作 ArrayBufferconst dataView = new DataView(buffer);// 将浮点数写入到 DataView 中dataView.setFloat32(0, floatNumber, false); // 第二个参数是偏移量,false 表示使用大端字节序// 从 DataView 中读取十六进制表示const hexString = dataView.getUint32(0, false).toString(16).toUpperCase();// 高低位转换const byteArray = [];for (let i = 0; i < hexString.length; i += 2) {byteArray.unshift(hexString.substr(i, 2));}return byteArray.join('');
}

这篇关于【物联网开发】、【小程序蓝牙通讯数据校验】JS CRC-16-MODBUS 验证 高位在前地位在后;JS异或校验;16进制字符串和float互转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429690

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

2390.从字符串中移除星号

给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号左侧最近的那个非星号字符,并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意: 生成的输入保证总是可以执行题面中描述的操作。 可以证明结果字符串是唯一的。 示例 1: 输入:s = “leet**cod*e” 输出:“lecoe” 解释:从左到右执行移除操作: 距离第 1 个

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

js+css二级导航

效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议