JavaScript:需要函数将包含二进制的字符串转换为十六进制,然后再转换回二进制

Posted

技术标签:

【中文标题】JavaScript:需要函数将包含二进制的字符串转换为十六进制,然后再转换回二进制【英文标题】:JavaScript: Need functions to convert a string containing binary to hex, then convert back to binary 【发布时间】:2013-06-16 19:04:19 【问题描述】:

假设我在 javascript 中有一个字符串,其中包含二进制数据。它可能看起来像这样:

var binary = '00001000010001000101010100001110';

我需要一些可靠的函数将其转换为十六进制字符串,然后再从该十六进制转换回二进制字符串。我知道以下功能

// Convert binary to hexadecimal
var hex = parseInt(binaryCharacters, 2).toString(16);

// Convert hexadecimal to binary
var binary = parseInt(hex, 16).toString(2)

但我不确定如何一次转换整个字符串。我是否理解我需要一次将每 4 个二进制位转换为一个十六进制字符?然后回到二进制,我遍历每个十六进制字符并再次转换为二进制?

我在 JavaScript 中寻找了一些简单的示例,但找不到。

非常感谢

【问题讨论】:

***.com/questions/7695450/…、gist.github.com/ghalimi/4525262、phpjs.org/functions/bin2hex。哦,谷歌,你最好的朋友…… @elclanrs 最后一个(bin2hex 函数)不起作用。它给了我像 3030303031303030303130303031303030313031303130 之类的输出......这看起来不正确。另外为什么用额外的'0'字符填充长度小于2的值?我认为它应该在一个半字节(4位)的基础上进行转换,每个半字节都会创建一个十六进制字符??? 【参考方案1】:

Try this jsfiddle.

对您来说更有趣的功能在这里。不一定是最干净或最有效的,但是是的:

// converts binary string to a hexadecimal string
// returns an object with key 'valid' to a boolean value, indicating
// if the string is a valid binary string.
// If 'valid' is true, the converted hex string can be obtained by
// the 'result' key of the returned object
function binaryToHex(s) 
    var i, k, part, accum, ret = '';
    for (i = s.length-1; i >= 3; i -= 4) 
        // extract out in substrings of 4 and convert to hex
        part = s.substr(i+1-4, 4);
        accum = 0;
        for (k = 0; k < 4; k += 1) 
            if (part[k] !== '0' && part[k] !== '1') 
                // invalid character
                return  valid: false ;
            
            // compute the length 4 substring
            accum = accum * 2 + parseInt(part[k], 10);
        
        if (accum >= 10) 
            // 'A' to 'F'
            ret = String.fromCharCode(accum - 10 + 'A'.charCodeAt(0)) + ret;
         else 
            // '0' to '9'
            ret = String(accum) + ret;
        
    
    // remaining characters, i = 0, 1, or 2
    if (i >= 0) 
        accum = 0;
        // convert from front
        for (k = 0; k <= i; k += 1) 
            if (s[k] !== '0' && s[k] !== '1') 
                return  valid: false ;
            
            accum = accum * 2 + parseInt(s[k], 10);
        
        // 3 bits, value cannot exceed 2^3 - 1 = 7, just convert
        ret = String(accum) + ret;
    
    return  valid: true, result: ret ;


// converts hexadecimal string to a binary string
// returns an object with key 'valid' to a boolean value, indicating
// if the string is a valid hexadecimal string.
// If 'valid' is true, the converted binary string can be obtained by
// the 'result' key of the returned object
function hexToBinary(s) 
    var i, k, part, ret = '';
    // lookup table for easier conversion. '0' characters are padded for '1' to '7'
    var lookupTable = 
        '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',
        'A': '1010', 'B': '1011', 'C': '1100', 'D': '1101',
        'E': '1110', 'F': '1111'
    ;
    for (i = 0; i < s.length; i += 1) 
        if (lookupTable.hasOwnProperty(s[i])) 
            ret += lookupTable[s[i]];
         else 
            return  valid: false ;
        
    
    return  valid: true, result: ret ;

【讨论】:

很酷,谢谢!效果很好。在我弄清楚如何做之后,我想出了一些功能来做这件事,检查我的答案。我认为我们可能只使用直接查找表/数组来转换为十六进制并转换回二进制,老实说,可能比手动执行要快得多。你怎么看? 这就像一个魅力。非常感谢兄弟。为此 +1。【参考方案2】:

为什么不使用Array.prototype.reduce?

var binstr = "00001000010001000101010100001110"

function bin2hex(b) 
    return b.match(/.4/g).reduce(function(acc, i) 
        return acc + parseInt(i, 2).toString(16);
    , '')


function hex2bin(h) 
    return h.split('').reduce(function(acc, i) 
        return acc + ('000' + parseInt(i, 16).toString(2)).substr(-4, 4);
    , '')


console.log(binstr);
> 00001000010001000101010100001110
console.log(bin2hex(binstr));
> 0844550e
console.log(hex2bin(bin2hex(binstr)));
> 00001000010001000101010100001110

链接到 jsfiddle here。

注意事项:

    bin2hex 中,如果您还想将小于4 位的尾随块转换为十六进制,请将4 替换为1,4。但是,将结果转换回二进制会产生与原始字符串不同的字符串。例如,来回转换"111101" 将产生"11110001"。 在hex2bin 中,二进制值用零填充,以便每个十六进制数字有 4 个二进制数字。

【讨论】:

【参考方案3】:

我找到了一个算法here,它有助于解释如何做到这一点。 this page on Wikipedia 还帮助确认了 4 位二进制到十六进制的映射。我想出了以下代码来做到这一点。我在网上找到的其他代码 sn-ps 根本不起作用。让我知道您是否会做出任何改进。您甚至可以使用 Wikipedia 中的信息进行直接查找表,这样会更快。

var tools = 
    /**
     * Converts binary code to hexadecimal string
     * @param string binaryString A string containing binary numbers e.g. '01001101'
     * @return string A string containing the hexadecimal numbers
     */
    convertBinaryToHexadecimal: function(binaryString)
    
        var output = '';

        // For every 4 bits in the binary string
        for (var i=0; i < binaryString.length; i+=4)
        
            // Grab a chunk of 4 bits
            var bytes = binaryString.substr(i, 4);

            // Convert to decimal then hexadecimal
            var decimal = parseInt(bytes, 2);
            var hex = decimal.toString(16);

            // Uppercase all the letters and append to output
            output += hex.toUpperCase();
        

        return output;      
    ,

    /**
     * Converts hexadecimal code to binary code
     * @param string A string containing single digit hexadecimal numbers
     * @return string A string containing binary numbers
     */
    convertHexadecimalToBinary: function(hexString)
    
        var output = '';

        // For each hexadecimal character
        for (var i=0; i < hexString.length; i++)
        
            // Convert to decimal
            var decimal = parseInt(hexString.charAt(i), 16);

            // Convert to binary and add 0s onto the left as necessary to make up to 4 bits
            var binary = this.leftPadding(decimal.toString(2), '0', 4);

            // Append to string         
            output += binary;
        

        return output;
    ,

    /**
     * Left pad a string with a certain character to a total number of characters
     * @param string inputString The string to be padded
     * @param string padCharacter The character that the string should be padded with
     * @param string totalCharacters The length of string that's required
     * @returns string A string with characters appended to the front of it
     */
    leftPadding: function(inputString, padCharacter, totalCharacters)
    
        // If the string is already the right length, just return it
        if (!inputString || !padCharacter || inputString.length >= totalCharacters)
        
            return inputString;
        

        // Work out how many extra characters we need to add to the string
        var charsToAdd = (totalCharacters - inputString.length)/padCharacter.length;

        // Add padding onto the string
        for (var i = 0; i < charsToAdd; i++)
        
            inputString = padCharacter + inputString;
        

        return inputString;
    
;

【讨论】:

【参考方案4】:

要将 bin 转换为十六进制和反转,我使用以下函数:

function bintohex()
    
     mybin = document.getElementById('bin').value;

     z = -1; number = 0;
     for(i = mybin.length; i > -1; i--) 
     
         //Every 1 in binary string is converted to decimal and added to number
         if(mybin.charAt(i) == "1")
             number += Math.pow(2, z);
         
         z+=1;
     
     // Return is converting decimal to hexadecimal
     document.getElementById('result').innerhtml = number.toString(16);


function hextobin()

     mybin = "";
     /// Converting to decimal value and geting ceil of decimal sqrt
     myhex = document.getElementById('hex').value;
     mydec = parseInt(myhex, 16);
     i = Math.ceil( Math.sqrt(mydec) );
     while(i >= 0)
     
         if(Math.pow(2, i) <= mydec)
             mydec = mydec-Math.pow(2, i);
             mybin += "1";
         else if(mybin != "")
             mybin = mybin + "0";
             i = i-1;
         
         document.getElementById('result').innerHTML = mybin;
Input binary: <input type = "text" id = "bin">
<button onclick = "bintohex()">Convert to Hex</button><br />

Input Hecadecimal: <input type = "text" id = "hex">
<button onclick = "hextobin()">Convert to Bin</button><br />

Results: <div id = "result"></div>

别忘了检查你的答案。

【讨论】:

以上是关于JavaScript:需要函数将包含二进制的字符串转换为十六进制,然后再转换回二进制的主要内容,如果未能解决你的问题,请参考以下文章

javaScript中十六进制转浮点字符串转为ArrayBuffer对象ArrayBuffer转16进度字符串16进制转10进制crc校验位十六进制转包含中文的字符串(包含小程序和浏览器)

JavaScript函数部分

生成的 blob 不包含完整的数据集

[JavaScript 刷题] 哈希表 - 检查一个字符串是否包含所有长度为 K 的二进制子串, leetcode 1461

使用 JavaScript 根据字符串创建十六进制颜色

切断JavaScript分割函数传递的最后几个值的字符