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 + 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.异或校验
// 生成校验码
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;
}
// 左侧补齐0
function pad(str, max) {
str = str.toString();
return str.length < max ? pad("0" + str, max) : str;
}
/*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('');
}
原文地址:https://blog.csdn.net/weixin_44705979/article/details/134626182
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_19826.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。