博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、js计算字符串的字节数方法:

//blob获取字符串的字节
    var debug = "好的";
    var blob = new Blob([debug],{type : 'text/plain'});
    console.log(blob)
    /**
     * 计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16
     * UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码
     * 
     * 000000 - 00007F(128个代码)      0zzzzzzz(00-7F)                             一个字节
     * 000080 - 0007FF(1920个代码)     110yyyyy(C0-DF) 10zzzzzz(80-BF)             两个字节
     * 000800 - 00D7FF 
       00E000 - 00FFFF(61440个代码)    1110xxxx(E0-EF) 10yyyyyy 10zzzzzz           三个字节
     * 010000 - 10FFFF(1048576个代码)  11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz  四个字节
     * 
     * 注: Unicode在范围 D800-DFFF 中不存在任何字符
     * {@link http://zh.wikipedia.org/wiki/UTF-8}
     * 
     * UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节
     * 000000 - 00FFFF  两个字节
     * 010000 - 10FFFF  四个字节
     * 
     * {@link http://zh.wikipedia.org/wiki/UTF-16}
     * @param  {String} str 
     * @param  {String} charset utf-8, utf-16
     * @return {Number}
     */
    var sizeof = function(str, charset){
        var total = 0,
            charCode,
            i,
            len;
        charset = charset ? charset.toLowerCase() : '';
        if(charset === 'utf-16' || charset === 'utf16'){
            for(i = 0, len = str.length; i < len; i++){
                charCode = str.charCodeAt(i);
                if(charCode <= 0xffff){
                    total += 2;
                }else{
                    total += 4;
                }
            }
        }else{
            for(i = 0, len = str.length; i < len; i++){
                charCode = str.charCodeAt(i);
                if(charCode <= 0x007f) {
                    total += 1;
                }else if(charCode <= 0x07ff){
                    total += 2;
                }else if(charCode <= 0xffff){
                    total += 3;
                }else{
                    total += 4;
                }
            }
        }
        return total;
    }
    console.log(sizeof(debug))

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

//字符串转ascii码,用charCodeAt();
//ascii码转字符串,用fromCharCode();
var str = "A";
var code = str.charCodeAt();
var str2 = String.fromCharCode(code);

 

十进制转二进制

var a = "i";
console.log(a.charCodeAt()); //105
console.log(a.charCodeAt().toString(2)); //1101001

 

//将字符串转换成二进制形式,中间用空格隔开
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("我们二进制数据y_+=ha好的")); //110001000010001 100111011101100 100111010001100 1000111111011011 101001000110110 110010101110000 110001101101110 1111001 1011111 101011 111101 1101000 1100001 101100101111101 111011010000100
console.log(strToBinary("@%$+测试{'obj':'124'}")); //1000000 100101 100100 101011 110110101001011 1000101111010101 1111011 100111 1101111 1100010 1101010 100111 111010 100111 110001 110010 110100 100111 1111101
 
//将二进制字符串转换成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 100111010001100 1000111111011011 101001000110110 110010101110000 110001101101110 1111001 1011111 101011 111101 1101000 1100001 101100101111101 111011010000100")); //我们二进制数据y_+=ha好的
console.log(binaryToStr("1000000 100101 100100 101011 110110101001011 1000101111010101 1111011 100111 1101111 1100010 1101010 100111 111010 100111 110001 110010 110100 100111 1111101")); //@%$+测试{'obj':'124'}