JS 数据互转 string,byte[],hex,number

9,097 阅读1分钟

string与byte[]互转

// 将字符串格式化为UTF8编码的字节
var writeUTF = function (str, isGetBytes=true) {
      var back = [];
      var byteSize = 0;
      for (var i = 0; i < str.length; i++) {
          var code = str.codePointAt(i);
          if (0x00 <= code && code <= 0x7f) {
                byteSize += 1;
                back.push(code);
          } else if (0x80 <= code && code <= 0x7ff) {
                byteSize += 2;
                back.push((192 | (31 & (code >> 6))));
                back.push((128 | (63 & code)))
          } else if ((0x800 <= code && code <= 0xd7ff) 
                  || (0xe000 <= code && code <= 0xffff)) {
                byteSize += 3;
                back.push((224 | (15 & (code >> 12))));
                back.push((128 | (63 & (code >> 6))));
                back.push((128 | (63 & code)))
          }else if((0x10000 <= code && code <= 0x10ffff)){
          	byteSize+=4;
            back.push((240 |(7 & (code>>18)));
            back.push((128 |(63 & (code>>12)));
            back.push((128 |(63 & (code>>6)));
            back.push((128 |(63 & (code)));
          }
       }
       for (i = 0; i < back.length; i++) {
            back[i] &= 0xff;
       }
       if (isGetBytes) {
            return back
       }
       if (byteSize <= 0xff) {
            return [0, byteSize].concat(back);
       } else {
            return [byteSize >> 8, byteSize & 0xff].concat(back);
        }
}
// 读取UTF8编码的字节,并专为Unicode的字符串
var readUTF = function (arr) {
    if (typeof arr === 'string') {
        return arr;
    }
    var UTF = '', _arr = this.init(arr);
    for (var i = 0; i < _arr.length; i++) {
        var one = _arr[i].toString(2),
                v = one.match(/^1+?(?=0)/);
        if (v && one.length == 8) {
            var bytesLength = v[0].length;
            var store = _arr[i].toString(2).slice(7 - bytesLength);
            for (var st = 1; st < bytesLength; st++) {
                store += _arr[st + i].toString(2).slice(2)
            }
            UTF += String.fromCharCode(parseInt(store, 2));
            i += bytesLength - 1
        } else {
            UTF += String.fromCharCode(_arr[i])
        }
    }
    return UTF
}

hex(十六进制)和byte[]互转

//hex=>bytes[]
export const hex2bytes=(hex)=>{
	let pos=0,len=hex.length;
    if(len%2!=0){
    	return null
    }
    len/2;
    let bytes=new Array();
    for(let i=0;i<len;i++){
    	let s=hex.substr(pos,2);
        let v=parseInt(s,16);
        bytes.push(v);
        pos+=2;
    }
    return bytes
}
//bytes[]=>hex
export const bytes2hex=(bytes)=>{
	let hex="",len=bytes.length;
    for(let i=0;i<len;i++){
    	let tmp,num=bytes[i];
        if(num<0){
        	tmp=(255+num+1).toString(16);
        }else{
        	tmp=num.toString(16);
        }
        if(tmp.length==1){
        	return "0"+tmp;
        }
        hex+=tmp;
    }
    return hex
}

chartAt()和chartCodeAt()和codePointAt()

  • String.chartAt() 返回匹配位置的字符
  • String.chartCodeAt() 返回 0 到 65535 之间的整数,表示给定索引处的 UTF-16 代码单元
  • String.codePointAt() 返回整个码点的值

emoji请使用codePointAt()处理!!!

Number.toString()使用

numObj.toString([radix])

返回指定 Number 对象的字符串表示形式

radix 指定要用于数字到字符串的转换的基数(从2到36)。如果未指定 radix 参数,则默认值为 10

parseInt()使用

parseInt(string,[radix])

string要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。

adix 可选 从 2 到 36,代表该进位系统的数字。例如说指定 10 就等于指定十进位。请注意,通常预设值不是 10 进位!

数字以16进制格式显示(0x开头)

function str_pad(num){
	if(typeof num!='number'){
    	throw new Error("not a number")
    }
	var hex=num.toString(16);
    var zero = '0000';
    var tmp  = 4-hex.length;
    return '0x' + zero.substr(0,tmp) + hex;
}
var num = 444;
str_pad(num);//0x01bc

参考