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