数据转换 (中文、字符、字母、数字)
1、10进制、中文、字符转16进制(ascii码)
change(str){ //str - 10进制数据 基本上只有正文需要做转换
if(!str) return '';
let len=str.length;
let arr=[],newReg = /[\u4e00-\u9fa5]/; //判断中文
for(var i=0;i<len;i++){
if(newReg.test(str[i])){
let s = encodeURI(str[i]).toString(16).replace(/%/g,'')
arr.push(s)
}else{
arr.push(str[i].charCodeAt().toString(16));
}
}
return arr.join('').toUpperCase()
}
2、计算长度
len(str){ //str - 16进制数据 具体的看文档中哪些数据参与计算
let len = (str.length/2); //字节数
let len2 = ((len%256).toString(16)+'').padStart(2,'0'); //看文档要求进行计算
return len2;
}
3、校验位
//校验位 按实际文档需求进行计算
jyStr(str16){ //16进制字符串 BBC异或校验
let checksum = '0x00';
for(let i = 0; i < str16.length - 1; i+=2){
checksum = checksum ^ ('0x'+(str16[i]+str16[i+1]));
}
let d = checksum.toString(16); //转16进制
d=d.padStart(2,'0'); //前面补0
return d;
}
4、数据发送
Buffer.form(data,"hex")
数据解析
1、数据接收
let str="",timer=null;
com.on('data',()=>{
str+=data.toString('hex');
let reg=/^01\w+03\w{2}$/; //这里按具体文档中的固定前缀和固定后缀进行数据完整性判断进行接收
let state = reg.test(str);
if(state){
//数据接收完全了,下面可以对数据进行解析,一般只需对正文进行装换,类 型进行判断
clearTimeout(timer);
str=""
}else{
//防止其他的非标准格式影响,做清空处理
clearTimeout(timer);
timer=setTimeout(()=>{
str=""
},200)
}
})
fromCode(str){ // str - 拿到数据后,需要解析中文、16机制转10进制只需当前只需执行函数
const _this = this;
try {
str=str.toUpperCase();
if(str){
let itotal='',len = str.length,num = 0;
let zh = /^E[0-9]/i;
while(num<len){
let s = str.substring(num,num+2);
if(zh.test(s)){ //判断是否是中文
s=str.substring(num,num+6);
let hzStr = _this.reconvert(s); //解析中文
itotal+=hzStr;
num=num+6;
}else{
itotal += String.fromCharCode(parseInt(s,16))
num=num+2;
}
}
return itotal
}
return null;
} catch (error) {
return null;
}
}
reconvert(s){
if(!s) return '';
let str = '';
for(let i=0;i<s.length;i+=2){
str+=('%'+s.substr(i,2))
}
str=unescape(str);
var out, i, len, c;
var char2, char3;
out = "";
len = str.length;
i = 0;
while(i < len) {
c = str.charCodeAt(i++);
switch(c >> 4)
{
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
out += str.charAt(i-1);
break;
case 12: case 13:
char2 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
char2 = str.charCodeAt(i++);
char3 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
}
}
return out;
}