zoukankan      html  css  js  c++  java
  • JAVASCRIPT 对有符号整型、无符号整型、浮点型、十六进制、二进制的数据处理

    1.十六进制字符串转有符号整型,支持S8、S16、S32:

    function hexToInt(hex) {
        if(hex.length % 2 != 0) {
            hex = "0" + hex;
        }
        var num = parseInt(hex, 16);
        var maxVal = Math.pow(2, hex.length / 2 * 8);
        if(num > maxVal / 2 - 1) {
            num = num - maxVal
        }
        return num;
    }

    2.十六进制字符串转无符号整型,支持U8、U16、U32:

    parseInt(str,16);

    3.十六进制字符串转有/无符号64位整型,支持S64、U64:

    function HexStringToInt64StringConverter(signed) {
                var hexCode = {
                    '0': "0000",
                    '1': "0001",
                    '2': "0010",
                    '3': "0011",
                    '4': "0100",
                    '5': "0101",
                    '6': "0110",
                    '7': "0111",
                    '8': "1000",
                    '9': "1001",
                    'a': "1010",
                    'b': "1011",
                    'c': "1100",
                    'd': "1101",
                    'e': "1110",
                    'f': "1111"
                };
                var preComputedLongMath = {
                    "20": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
                    "21": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2],
                    "22": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4],
                    "23": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8],
                    "24": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6],
                    "25": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2],
                    "26": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4],
                    "27": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 8],
                    "28": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 6],
                    "29": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 2],
                    "210": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4],
                    "211": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 8],
                    "212": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 9, 6],
                    "213": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 9, 2],
                    "214": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 3, 8, 4],
                    "215": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 7, 6, 8],
                    "216": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5, 5, 3, 6],
                    "217": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 7, 2],
                    "218": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 2, 1, 4, 4],
                    "219": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 4, 2, 8, 8],
                    "220": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 8, 5, 7, 6],
                    "221": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 9, 7, 1, 5, 2],
                    "222": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 9, 4, 3, 0, 4],
                    "223": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 8, 8, 6, 0, 8],
                    "224": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 7, 7, 7, 2, 1, 6],
                    "225": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 5, 5, 4, 4, 3, 2],
                    "226": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 1, 0, 8, 8, 6, 4],
                    "227": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 2, 1, 7, 7, 2, 8],
                    "228": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 8, 4, 3, 5, 4, 5, 6],
                    "229": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 6, 8, 7, 0, 9, 1, 2],
                    "230": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 3, 7, 4, 1, 8, 2, 4],
                    "231": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 4, 7, 4, 8, 3, 6, 4, 8],
                    "232": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 9, 4, 9, 6, 7, 2, 9, 6],
                    "233": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 5, 8, 9, 9, 3, 4, 5, 9, 2],
                    "234": [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 1, 7, 9, 8, 6, 9, 1, 8, 4],
                    "235": [0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 5, 9, 7, 3, 8, 3, 6, 8],
                    "236": [0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 7, 1, 9, 4, 7, 6, 7, 3, 6],
                    "237": [0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 7, 4, 3, 8, 9, 5, 3, 4, 7, 2],
                    "238": [0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 4, 8, 7, 7, 9, 0, 6, 9, 4, 4],
                    "239": [0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 9, 7, 5, 5, 8, 1, 3, 8, 8, 8],
                    "240": [0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 9, 5, 1, 1, 6, 2, 7, 7, 7, 6],
                    "241": [0, 0, 0, 0, 0, 0, 0, 2, 1, 9, 9, 0, 2, 3, 2, 5, 5, 5, 5, 2],
                    "242": [0, 0, 0, 0, 0, 0, 0, 4, 3, 9, 8, 0, 4, 6, 5, 1, 1, 1, 0, 4],
                    "243": [0, 0, 0, 0, 0, 0, 0, 8, 7, 9, 6, 0, 9, 3, 0, 2, 2, 2, 0, 8],
                    "244": [0, 0, 0, 0, 0, 0, 1, 7, 5, 9, 2, 1, 8, 6, 0, 4, 4, 4, 1, 6],
                    "245": [0, 0, 0, 0, 0, 0, 3, 5, 1, 8, 4, 3, 7, 2, 0, 8, 8, 8, 3, 2],
                    "246": [0, 0, 0, 0, 0, 0, 7, 0, 3, 6, 8, 7, 4, 4, 1, 7, 7, 6, 6, 4],
                    "247": [0, 0, 0, 0, 0, 1, 4, 0, 7, 3, 7, 4, 8, 8, 3, 5, 5, 3, 2, 8],
                    "248": [0, 0, 0, 0, 0, 2, 8, 1, 4, 7, 4, 9, 7, 6, 7, 1, 0, 6, 5, 6],
                    "249": [0, 0, 0, 0, 0, 5, 6, 2, 9, 4, 9, 9, 5, 3, 4, 2, 1, 3, 1, 2],
                    "250": [0, 0, 0, 0, 1, 1, 2, 5, 8, 9, 9, 9, 0, 6, 8, 4, 2, 6, 2, 4],
                    "251": [0, 0, 0, 0, 2, 2, 5, 1, 7, 9, 9, 8, 1, 3, 6, 8, 5, 2, 4, 8],
                    "252": [0, 0, 0, 0, 4, 5, 0, 3, 5, 9, 9, 6, 2, 7, 3, 7, 0, 4, 9, 6],
                    "253": [0, 0, 0, 0, 9, 0, 0, 7, 1, 9, 9, 2, 5, 4, 7, 4, 0, 9, 9, 2],
                    "254": [0, 0, 0, 1, 8, 0, 1, 4, 3, 9, 8, 5, 0, 9, 4, 8, 1, 9, 8, 4],
                    "255": [0, 0, 0, 3, 6, 0, 2, 8, 7, 9, 7, 0, 1, 8, 9, 6, 3, 9, 6, 8],
                    "256": [0, 0, 0, 7, 2, 0, 5, 7, 5, 9, 4, 0, 3, 7, 9, 2, 7, 9, 3, 6],
                    "257": [0, 0, 1, 4, 4, 1, 1, 5, 1, 8, 8, 0, 7, 5, 8, 5, 5, 8, 7, 2],
                    "258": [0, 0, 2, 8, 8, 2, 3, 0, 3, 7, 6, 1, 5, 1, 7, 1, 1, 7, 4, 4],
                    "259": [0, 0, 5, 7, 6, 4, 6, 0, 7, 5, 2, 3, 0, 3, 4, 2, 3, 4, 8, 8],
                    "260": [0, 1, 1, 5, 2, 9, 2, 1, 5, 0, 4, 6, 0, 6, 8, 4, 6, 9, 7, 6],
                    "261": [0, 2, 3, 0, 5, 8, 4, 3, 0, 0, 9, 2, 1, 3, 6, 9, 3, 9, 5, 2],
                    "262": [0, 4, 6, 1, 1, 6, 8, 6, 0, 1, 8, 4, 2, 7, 3, 8, 7, 9, 0, 4],
                    "263": [0, 9, 2, 2, 3, 3, 7, 2, 0, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0, 8],
                    "264": [1, 8, 4, 4, 6, 7, 4, 4, 0, 7, 3, 7, 0, 9, 5, 5, 1, 6, 1, 6],
                    "265": [3, 6, 8, 9, 3, 4, 8, 8, 1, 4, 7, 4, 1, 9, 1, 0, 3, 2, 3, 2]
                };
                if(typeof(signed) != 'boolean') signed = false;
     
                function toBinary(hex) {
                    hex = hex.toLowerCase();
                    var binary = "";
                    for(var i = 0; i < hex.length; i++) {
                        binary += hexCode[hex[i]];
                    }
                    return binary;
                }
     
                function to1nsComplement(binary) {
                    var compliment = "";
                    for(var i = 0; i < binary.length; i++) {
                        compliment += (binary.charAt(i) == "1" ? "0" : "1");
                    }
                    return compliment;
                }
     
                function arrayAdd(a, b) {
                    var carry = 0;
                    var number = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
                    for(var i = 19; i >= 0; i--) {
                        number[i] = a[i] + b[i] + carry;
                        if(number[i].toString().length > 1) {
                            carry = parseInt(number[i].toString().substring(0, number[i].toString().length - 1), 10);
                            number[i] = parseInt(number[i].toString().substring(number[i].toString().length - 1), 10)
                        } else {
                            carry = 0;
                        }
                    }
                    return number;
                }
     
                function removeZeroPad(number) {
                    var lock = false;
                    var output = [];
                    for(var i = 0; i < number.length; i++) {
                        if(lock) {
                            output.push(number[i]);
                        } else {
                            if(number[i] != 0) {
                                lock = true;
                                output.push(number[i]);
                            }
                        }
                    }
                    return output;
                }
     
                function binaryToDec(binary) {
                    var negative = false;
                    if(signed && (binary.charAt(0) == 1)) {
                        negative = true;
                    }
                    if(signed) {
                        binary = binary.substring(1);
                        if(negative) {
                            binary = to1nsComplement(binary);
                        }
                    }
                    var pos = 0;
                    var number = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
                    for(var i = binary.length - 1; i >= 0; i--) {
                        if(binary.charAt(i) == 1) {
                            number = arrayAdd(number, preComputedLongMath["2" + pos])
                        }
                        pos++;
                    }
                    if(negative) {
                        number = removeZeroPad(arrayAdd(number, preComputedLongMath["20"]));
                        number.splice(0, 0, "-");
                    } else {
                        number = removeZeroPad(number);
                    }
                    return number.join("");
                }
     
                this.convert = function(hex) {
                    var binary = toBinary(hex);
                    return binaryToDec(binary);
                };
    }

    使用方法:

    lid64 = new HexStringToInt64StringConverter(true).convert(str); 

    //true为有符号、false为无符号,str为十六进制字符串

    4.二进制字符串与十六进制字符串相互转换:

    //二进制转十六进制
    function bin_to_hex(str) {
        let hex_array = [{
                key: 0,
                val: "0000"
            }, {
                key: 1,
                val: "0001"
            }, {
                key: 2,
                val: "0010"
            }, {
                key: 3,
                val: "0011"
            }, {
                key: 4,
                val: "0100"
            }, {
                key: 5,
                val: "0101"
            }, {
                key: 6,
                val: "0110"
            }, {
                key: 7,
                val: "0111"
            },
            {
                key: 8,
                val: "1000"
            }, {
                key: 9,
                val: "1001"
            }, {
                key: 'a',
                val: "1010"
            }, {
                key: 'b',
                val: "1011"
            }, {
                key: 'c',
                val: "1100"
            }, {
                key: 'd',
                val: "1101"
            }, {
                key: 'e',
                val: "1110"
            }, {
                key: 'f',
                val: "1111"
            }
        ]
        let value = ''
        let list = []
        //console.log(str)
        if(str.length % 4 !== 0) {
            let a = "0000"
            let b = a.substring(0, 4 - str.length % 4)
            str = b.concat(str)
        }
        //console.log(str)
        while(str.length > 4) {
            list.push(str.substring(0, 4))
            str = str.substring(4);
        }
        list.push(str)
        //console.log(list)
        for(let i = 0; i < list.length; i++) {
            for(let j = 0; j < hex_array.length; j++) {
                if(list[i] == hex_array[j].val) {
                    value = value.concat(hex_array[j].key)
                    break
                }
            }
        }
        //console.log(value)
        return value
        
    }
     
    //十六进制转二进制
    function hex_to_bin(str) {
        let hex_array = [{
                key: 0,
                val: "0000"
            }, {
                key: 1,
                val: "0001"
            }, {
                key: 2,
                val: "0010"
            }, {
                key: 3,
                val: "0011"
            }, {
                key: 4,
                val: "0100"
            }, {
                key: 5,
                val: "0101"
            }, {
                key: 6,
                val: "0110"
            }, {
                key: 7,
                val: "0111"
            },
            {
                key: 8,
                val: "1000"
            }, {
                key: 9,
                val: "1001"
            }, {
                key: 'a',
                val: "1010"
            }, {
                key: 'b',
                val: "1011"
            }, {
                key: 'c',
                val: "1100"
            }, {
                key: 'd',
                val: "1101"
            }, {
                key: 'e',
                val: "1110"
            }, {
                key: 'f',
                val: "1111"
            }
        ]
     
        let value = ""
        for(let i = 0; i < str.length; i++) {
            for(let j = 0; j < hex_array.length; j++) {
                if(str.charAt(i) == hex_array[j].key) {
                    value = value.concat(hex_array[j].val)
                    break
                }
            }
        }
        //console.log(value)
        return value
    }

    5.十六进制字符串与FLOAT互转

    function InsertString(t, c, n) {
        var r = new Array();
        for(var i = 0; i * 2 < t.length; i++) {
            r.push(t.substr(i * 2, n));
        }
        return r.join(c);
    }
     
    function FillString(t, c, n, b) {
        if((t == "") || (c.length != 1) || (n <= t.length)) {
            return t;
        }
        var l = t.length;
        for(var i = 0; i < n - l; i++) {
            if(b == true) {
                t = c + t;
            } else {
                t += c;
            }
        }
        return t;
    }
     
    function HexToSingle(t) {
        t = t.replace(/s+/g, "");
        if(t == "") {
            return "";
        }
        if(t == "00000000") {
            return "0";
        }
        if((t.length > 8) || (isNaN(parseInt(t, 16)))) {
            return "Error";
        }
        if(t.length < 8) {
            t = FillString(t, "0", 8, true);
        }
        t = parseInt(t, 16).toString(2);
        t = FillString(t, "0", 32, true);
        var s = t.substring(0, 1);
        var e = t.substring(1, 9);
        var m = t.substring(9);
        e = parseInt(e, 2) - 127;
        m = "1" + m;
        if(e >= 0) {
            m = m.substr(0, e + 1) + "." + m.substring(e + 1)
        } else {
            m = "0." + FillString(m, "0", m.length - e - 1, true)
        }
        if(m.indexOf(".") == -1) {
            m = m + ".0";
        }
        var a = m.split(".");
        var mi = parseInt(a[0], 2);
        var mf = 0;
        for(var i = 0; i < a[1].length; i++) {
            mf += parseFloat(a[1].charAt(i)) * Math.pow(2, -(i + 1));
        }
        m = parseInt(mi) + parseFloat(mf);
        if(s == 1) {
            m = 0 - m;
        }
        return m;
    }
     
    function SingleToHex(t) {
        if(t == "") {
            return "";
        }
        t = parseFloat(t);
        if(isNaN(t) == true) {
            return "Error";
        }
        if(t == 0) {
            return "00000000";
        }
        var s,
            e,
            m;
        if(t > 0) {
            s = 0;
        } else {
            s = 1;
            t = 0 - t;
        }
        m = t.toString(2);
        if(m >= 1) {
            if(m.indexOf(".") == -1) {
                m = m + ".0";
            }
            e = m.indexOf(".") - 1;
        } else {
            e = 1 - m.indexOf("1");
        }
        if(e >= 0) {
            m = m.replace(".", "");
        } else {
            m = m.substring(m.indexOf("1"));
        }
        if(m.length > 24) {
            m = m.substr(0, 24);
        } else {
            m = FillString(m, "0", 24, false)
        }
        m = m.substring(1);
        e = (e + 127).toString(2);
        e = FillString(e, "0", 8, true);
        var r = parseInt(s + e + m, 2).toString(16);
        r = FillString(r, "0", 8, true);
        return InsertString(r, " ", 2).toUpperCase();
    }
     
    function FormatHex(t, n, ie) {
        var r = new Array();
        var s = "";
        var c = 0;
        for(var i = 0; i < t.length; i++) {
            if(t.charAt(i) != " ") {
                s += t.charAt(i);
                c += 1;
                if(c == n) {
                    r.push(s);
                    s = "";
                    c = 0;
                }
            }
            if(ie == false) {
                if((i == t.length - 1) && (s != "")) {
                    r.push(s);
                }
            }
        }
        return r.join("
    ");
    }
     
    function FormatHexBatch(t, n, ie) {
        var a = t.split("
    ");
        var r = new Array();
        for(var i = 0; i < a.length; i++) {
            r[i] = FormatHex(a[i], n, ie);
        }
        return r.join("
    ");
    }
     
    function HexToSingleBatch(t) {
        var a = FormatHexBatch(t, 8, true).split("
    ");
        var r = new Array();
        for(var i = 0; i < a.length; i++) {
            r[i] = HexToSingle(a[i]);
        }
        return r.join("
    ");
    }
     
    function SingleToHexBatch(t) {
        var a = t.split("
    ");
        var r = new Array();
        for(var i = 0; i < a.length; i++) {
            r[i] = SingleToHex(a[i]);
        }
        return r.join("
    ");
    }

    使用方法:

    //十六进制字符串转浮点

    HexToSingle(str)

    //浮点转十六进制字符串

    SingleToHex(str)

  • 相关阅读:
    数学形态学——腐蚀、膨胀、开、闭、细化
    VS2010中 报错:error C2146、error C4430 原因一:缺少CvvImage类
    帧同步和状态同步
    HTML5触摸事件演化tap事件
    screenX clientX pageX的区别
    phaser的小游戏的onInputDown问题
    phaser入手
    pixi.js 微信小游戏 入手
    正则表达式
    剖析Vue原理&实现双向绑定MVVM-2
  • 原文地址:https://www.cnblogs.com/zhouheblog/p/13578012.html
Copyright © 2011-2022 走看看