63

テキストからバイナリコードへ

JavaScript でテキストエリア内のテキストをバイナリ コードに変換したいと考えています。

たとえば、ユーザーTESTがテキストエリアに " " と入力すると、値 " 01010100 01000101 01010011 01010100" が返されます。

switch ステートメントを使用して各文字にバイナリ コード値 (例: case "T": return "01010100) を割り当てたり、その他の同様の手法を使用したりしたくありません。

これが私の言いたいことを示すJSFiddleです。これはネイティブ JavaScript で可能ですか?

4

14 に答える 14

66

あなたがすべきことは、charCodeAt関数を使用してすべての文字を変換して、アスキーコードを10進数で取得することです。次に、次を使用してバイナリ値に変換できますtoString(2)

HTML:

<input id="ti1" value ="TEST"/>
<input id="ti2"/>
<button onClick="convert();">Convert!</button>

JS:

function convert() {
  var output = document.getElementById("ti2");
  var input = document.getElementById("ti1").value;
  output.value = "";
  for (var i = 0; i < input.length; i++) {
      output.value += input[i].charCodeAt(0).toString(2) + " ";
  }
}

そして、ここにフィドルがあります:http://jsfiddle.net/fA24Y/1/

于 2013-01-20T23:51:42.573 に答える
39

これはあなたが得ることができる最も簡単かもしれません:

function text2Binary(string) {
    return string.split('').map(function (char) {
        return char.charCodeAt(0).toString(2);
    }).join(' ');
}
于 2015-12-03T17:12:00.893 に答える
7
var PADDING = "00000000"

var string = "TEST"
var resultArray = []

for (var i = 0; i < string.length; i++) {
  var compact = string.charCodeAt(i).toString(2)
  var padded  = compact.substring(0, PADDING.length - compact.length) + compact

  resultArray.push(padded)
}

console.log(resultArray.join(" "))
于 2013-01-20T23:46:16.773 に答える
6

他の答えは、ほとんどの場合に有効です。charCodeAt()ただし、および related は UTF-8 文字列では機能しないことに注意してください (つまり、標準の ASCII 範囲外の文字があると、エラーがスローされます)。これが回避策です。

// UTF-8 to binary
var utf8ToBin = function( s ){
    s = unescape( encodeURIComponent( s ) );
    var chr, i = 0, l = s.length, out = '';
    for( ; i < l; i ++ ){
        chr = s.charCodeAt( i ).toString( 2 );
        while( chr.length % 8 != 0 ){ chr = '0' + chr; }
        out += chr;
    }
    return out;
};

// Binary to UTF-8
var binToUtf8 = function( s ){
    var i = 0, l = s.length, chr, out = '';
    for( ; i < l; i += 8 ){
        chr = parseInt( s.substr( i, 8 ), 2 ).toString( 16 );
        out += '%' + ( ( chr.length % 2 == 0 ) ? chr : '0' + chr );
    }
    return decodeURIComponent( out );
};

関数はescape/unescape()非推奨です。ポリフィルが必要な場合は、http://jsfiddle.net/47zwb41o にあるより包括的な UTF-8 エンコーディングの例を確認してください

于 2017-01-18T06:39:03.780 に答える
5

先頭が 0 の 8 ビット文字

'sometext'
        .split('')
        .map((char) => '00'.concat(char.charCodeAt(0).toString(2)).slice(-8))
        .join(' ');

6ビットまたは7ビットが必要な場合は、変更するだけです.slice(-8)

于 2016-07-13T22:34:41.413 に答える
4

正しい方向へのほんのヒント

var foo = "TEST",
    res = [ ];

foo.split('').forEach(function( letter ) {
    var bin     = letter.charCodeAt( 0 ).toString( 2 ),
        padding = 8 - bin.length;

    res.push( new Array( padding+1 ).join( '0' ) + bin );
});

console.log( res );
于 2013-01-20T23:42:11.950 に答える
3

サポートされているノードまたはブラウザーで作業している場合BigInt、このバージョンでは、高価な文字列構造を最後に保存することでコストを削減できます。

const zero = 0n
const shift = 8n

function asciiToBinary (str) {
  const len = str.length
  let n = zero
  for (let i = 0; i < len; i++) {
    n = (n << shift) + BigInt(str.charCodeAt(i))
  }
  return n.toString(2).padStart(len * 8, 0)
}

この単純な es6+ 実装を含む、ここで言及されている他のソリューションよりも約 2 倍高速です。

const toBinary = s => [...s]
  .map(x => x
    .codePointAt()
    .toString(2)
    .padStart(8,0)
  )
  .join('')

ユニコード文字を処理する必要がある場合は、次の男がいます。

const zero = 0n
const shift = 8n
const bigShift = 16n
const byte = 255n

function unicodeToBinary (str) {
  const len = str.length
  let n = zero
  for (let i = 0; i < len; i++) {
    const bits = BigInt(str.codePointAt(i))
    n = (n << (bits > byte ? bigShift : shift)) + bits
  }
  const bin = n.toString(2)
  return bin.padStart(8 * Math.ceil(bin.length / 8), 0)
}
于 2020-01-10T00:33:47.137 に答える
1

const textToBinary = (string) => {
    return string.split('').map((char) => 
      char.charCodeAt().toString(2)).join(' ');
}

console.log(textToBinary('hello world'))

于 2022-01-03T21:46:04.437 に答える