JS字符串与二进制的相互转化

https://hlddz.huanle.qq.com/index.html

欢乐斗地主H5版中,websocket连接所传输的数据类型是binary 二进制数据,

this.j.binaryType = "arraybuffer";

不知数据有没有加密,有时间再折腾下,搞个H5的记牌器,更或者可以搞下自动斗地主AI

//将字符串转换成二进制形式,中间用空格隔开
function strToBinary(str){
    var result = [];
    var list = str.split("");
    for(var i=0;i<list.length;i++){
        if(i != 0){
            result.push(" ");
        }
        var item = list[i];
        var binaryStr = item.charCodeAt().toString(2);
        result.push(binaryStr);
    }   
    return result.join("");
}
 
console.log(strToBinary("我们")); //110001000010001 100111011101100
console.log(strToBinary("@%$+")); //1000000 100101 100100 101011
 
//将二进制字符串转换成Unicode字符串
function binaryToStr(str){
    var result = [];
    var list = str.split(" ");
    for(var i=0;i<list.length;i++){
         var item = list[i];
         var asciiCode = parseInt(item,2);
         var charValue = String.fromCharCode(asciiCode);
         result.push(charValue);
    }
    return result.join("");
}
 
console.log(binaryToStr("110001000010001 100111011101100")); //我们
console.log(binaryToStr("1000000 100101 100100 101011")); //@%$+ 

 *****************

js解释数据包
做一个项目,服务器要给我发一个数据包,格式为,前面16位short,后32位int,后面就全是string,我用javascript怎么去把这个数据包解读出来?   用WebSocket,接收到的就是一个Blob对象.而我要给服务器返回的也是这种格式,我又怎么把我的数据封装成这样的数据包?

------解决方案--------------------

var reader = { 
  readAs: function(type,blob,cb){
    var r = new FileReader();
    r.onloadend = function(){
      if(typeof(cb) === 'function') {
        cb.call(r,r.result);
      }
    }
    try{
      r['readAs'+type](blob);
    }catch(e){}
  }
}
function parseBlob(blob){
  var shortVar, intVar, stringVar;
  reader.readAs('ArrayBuffer',blob.slice(0,2),function(arr){
    shortVar = (new Int16Array(arr))[0];
    console.log(shortVar);
  });
  reader.readAs('ArrayBuffer',blob.slice(2,6),function(arr){
    intVar = (new Int32Array(arr))[0];
    console.log(intVar);
  });
  reader.readAs('Text',blob.slice(6,blob.size,'text/plain;charset=UTF-8'),function(result){
    stringVar = result;
    console.log(stringVar);
  });
}
var buffer = new ArrayBuffer(6);//建立6个字节的缓冲,前两个字节是short,后四个是int
var bufferView = new Int16Array(buffer); //建立16位的视图,那么视图的长度应该是3
bufferView[0] = 32767;
bufferView[1] = 0;
bufferView[2] = 1;  
//现在buffer中的内容由低位到高位应该是 
//11111111 11111110 00000000 00000000 100000000 00000000
var blob = new Blob([bufferView,"words words 文本文本文本文本"]);
//构造这个blob类型
//测试一下parseBlob函数是否正确
parseBlob(blob);
//32767
//65536
//words words 文本文本文本文本
//第一个short是32767
//第二个int,前16位为0,第17位为1,所以结果是65536
//第三个字符串,和我们构造blob的时候一样

 相关链接:

JS字符串与二进制的相互转化

js解析websocket二进制数据包

posted @ 2021-02-08 18:08  笠航  阅读(1396)  评论(0编辑  收藏  举报