數(shù)據(jù)轉(zhuǎn)換 (中文、字符、字母、數(shù)字)
1、10進(jìn)制、中文、字符轉(zhuǎn)16進(jìn)制(ascii碼)
change(str){ //str - 10進(jìn)制數(shù)據(jù) 基本上只有正文需要做轉(zhuǎn)換
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、計(jì)算長(zhǎng)度
len(str){ //str - 16進(jìn)制數(shù)據(jù) 具體的看文檔中哪些數(shù)據(jù)參與計(jì)算
let len = (str.length/2); //字節(jié)數(shù)
let len2 = ((len%256).toString(16)+'').padStart(2,'0'); //看文檔要求進(jìn)行計(jì)算
return len2;
}
3、校驗(yàn)位
//校驗(yàn)位 按實(shí)際文檔需求進(jìn)行計(jì)算
jyStr(str16){ //16進(jìn)制字符串 BBC異或校驗(yàn)
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); //轉(zhuǎn)16進(jìn)制
d=d.padStart(2,'0'); //前面補(bǔ)0
return d;
}
4、數(shù)據(jù)發(fā)送
Buffer.form(data,"hex")
數(shù)據(jù)解析
1、數(shù)據(jù)接收
let str="",timer=null;
com.on('data',()=>{
str+=data.toString('hex');
let reg=/^01\w+03\w{2}$/; //這里按具體文檔中的固定前綴和固定后綴進(jìn)行數(shù)據(jù)完整性判斷進(jìn)行接收
let state = reg.test(str);
if(state){
//數(shù)據(jù)接收完全了,下面可以對(duì)數(shù)據(jù)進(jìn)行解析,一般只需對(duì)正文進(jìn)行裝換,類 型進(jìn)行判斷
clearTimeout(timer);
str=""
}else{
//防止其他的非標(biāo)準(zhǔn)格式影響,做清空處理
clearTimeout(timer);
timer=setTimeout(()=>{
str=""
},200)
}
})
fromCode(str){ // str - 拿到數(shù)據(jù)后,需要解析中文、16機(jī)制轉(zhuǎn)10進(jìn)制只需當(dāng)前只需執(zhí)行函數(shù)
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;
}