【问题标题】:Converting a string into binary and back将字符串转换为二进制并返回
【发布时间】:2023-03-02 23:08:02
【问题描述】:

我得到了一项任务,将给定的字符串转换为二进制并再次转换回字符串。

第一部分很简单

function stringToBinary(input) {
  var characters = input.split('');

  return characters.map(function(char) {
    return char.charCodeAt(0).toString(2)
  }).join('');
}

alert(stringToBinary('test'))

但是,我无法理解如何将生成的字符串分解为字节。到目前为止我尝试过这个:

function binaryToString(input) {
  var bits = input.split('');
  
  var byte = '';
  return bits.map(function(bit) {
    byte = byte + bit;
    
    if (byte.length == 8) {
      var char = byte; // how can I convert this to a character again?
      byte = '';
      return char;
    }
    
    return '';
  }).join('');
}

alert(binaryToString('1110100110010111100111110100'));

如何将字节再次转换为字符?而且感觉也有点奇怪。有没有更好、更快的方法来收集这些字节

【问题讨论】:

标签: javascript character


【解决方案1】:

我现在只是在做一个确切的项目,这里是从文本转换为二进制和从二进制转换为文本的函数:

function binaryToTexttConverter(str) {
  let wordArray = [];
  let message = str.split(" ").map((stack) => {
    let numberArray = parseInt(stack, 2);
    let letters = String.fromCharCode(numberArray);
    wordArray.push(letters);
  });
  let output = wordArray.join("");
  console.log(output);
  return output;
}

// binaryToTexttConverter("test binary"); 

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

function textToBinaryConverter(str) {
  let xterCodesArray = [];
  let splitted = str.split("");
  for (i = 0; i < splitted.length; i++) {
    let xterCodes = splitted[i].charCodeAt(splitted[i]);
    xterCodesArray.push(xterCodes.toString(2));
  }
  console.log(xterCodesArray.join(" "));
  return xterCodesArray.join(" ");
}

// textToBinaryConverter("test string");

【讨论】:

    【解决方案2】:

    首先,您需要采用长度为8 且填充字符为零的String#padStart,将转换后的字符串的长度作为转换回字符串的输入。

    function stringToBinary(input) {
        var characters = input.split('');
    
        return characters
            .map(function(char) {
                return char.charCodeAt(0).toString(2).padStart(8, 0)
            })
            .join(' '); // show with space for each byte
                        // watch leading zero, which is missed in the former code
    }
    
    console.log(stringToBinary('test'))

    你需要把这个字符串分割成八个字符的长度,然后再转换回来。

    function binaryToString(input) {
        return input
            .match(/.{8}/g)                                    // take 8 characters
            .map(function(byte) {
                return String.fromCharCode(parseInt(byte, 2));
            })
            .join('');
    }
    
    console.log(binaryToString('01110100011001010111001101110100'));

    当您要求更快的方法时,您可以将拆分后的转换字节传播到 fromCharCode 函数。

    function binaryToString(input) {
        return String
            .fromCharCode(...input
                .match(/.{8}/g)
                .map(byte => parseInt(byte, 2))
            );
    }
    
    console.log(binaryToString('01110100011001010111001101110100'));

    【讨论】:

    • 谢谢!这真的很有帮助。我不知道我需要前导零。那么您的解决方案是否希望我创建带有空格的二进制字符串?
    • 不,只是显示前导零和八个字符的长度。
    【解决方案3】:

    您的stringToBinary 函数有问题。将字符转换为二进制只会给您留下最少的位数。所以还是需要转成8位字符串。

    另一件事是,您可以从二进制文件中获取前 8 位数字,并随时修剪输入,如下例所示。

    function stringToBinary(input) {
      var characters = input.split('');
    
      return characters.map(function(char) {
        const binary = char.charCodeAt(0).toString(2)
        const pad = Math.max(8 - binary.length, 0);
        // Just to make sure it is 8 bits long.
        return '0'.repeat(pad) + binary;
      }).join('');
    }
    
    function binaryToString(input) {
      let bytesLeft = input;
      let result = '';
    
      // Check if we have some bytes left
      while (bytesLeft.length) {
        // Get the first digits
        const byte = bytesLeft.substr(0, 8);
        bytesLeft = bytesLeft.substr(8);
    
        result += String.fromCharCode(parseInt(byte, 2));
      }
    
      return result;
    }
    
    const binary = stringToBinary('test');
    console.log(binaryToString(binary));

    【讨论】:

    • 谢谢,这真的很有帮助!我不知道这里需要前导零。
    • 当您使用转译器(例如 babel)或者您不关心 IE11 时,您也可以使用 padStart,就像在 Nina Scholz 的回答中一样。
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2013-02-11
    相关资源
    最近更新 更多