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

1.CRC校验

javascript 复制代码
/*计算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 + 1

	for (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.异或校验

javascript 复制代码
// 生成校验码
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方法

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

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

javascript 复制代码
/*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));
	}

	// 创建一个包含十六进制数的 ArrayBuffer
	const 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 字节的 ArrayBuffer
	const buffer = new ArrayBuffer(4);

	// 使用 DataView 来操作 ArrayBuffer
	const 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('');
}
相关推荐
sakiko_16 分钟前
Swift学习笔记39-实战注意事项
前端·笔记·学习·swift
海带紫菜菠萝汤16 分钟前
MSE (Media Source Extensions) 实战:流媒体分块加载与自适应码率
前端·javascript·音视频
@小匠21 分钟前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端
Knight_AL22 分钟前
Lombok @Builder 踩坑:build() 前后对象类型不一样
android·java·开发语言
Dlrb121124 分钟前
Linux驱动---Linux 中断系统及其上与下半部的介绍与阻塞IO实现按键检测
linux·嵌入式硬件·imx6ull·中断·阻塞io
黄华SJ520it26 分钟前
顶俏洗衣液模式制度开发介绍:S2B2C社交分销+多门店核销系统全解析
前端·数据库·小程序·零售·系统开发
国产HT1621B31 分钟前
YL4056 NTC 外围电阻 R3/R4 计算:从公式推导到工程选型
科技·单片机·嵌入式硬件
神明不懂浪漫38 分钟前
【第五章】队列
开发语言·数据结构·经验分享·笔记·算法
吃好睡好便好39 分钟前
MATLAB仿真框图3
开发语言·matlab·仿真·simulink
张元清1 小时前
React useMount Hook:只在挂载时执行一次的正确姿势 (2026)
javascript·react.js