web-dev-qa-db-fra.com

Comment convertir du texte en code binaire en JavaScript?

Texte en code binaire

Je veux que JavaScript traduise le texte d'une zone de texte en code binaire.

Par exemple, si un utilisateur tape "TEST" dans la zone de texte, la valeur "01010100 01000101 01010011 01010100" doit être renvoyée.

J'aimerais éviter d'utiliser une instruction switch pour attribuer à chaque caractère une valeur de code binaire (par exemple case "T": return "01010100) ou toute autre technique similaire. 

Voici un JSFiddle pour montrer ce que je veux dire. Est-ce possible en JavaScript natif?

35
Shrey Gupta

Ce que vous devriez faire est de convertir chaque caractère en utilisant la fonction charCodeAt pour obtenir le code Ascii en décimal. Ensuite, vous pouvez le convertir en valeur binaire en utilisant 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) + " ";
  }
}

Et voici un violon: http://jsfiddle.net/fA24Y/1/

40
Majid Laissi

C'est peut-être le plus simple que vous puissiez obtenir:

function text2Binary(string) {
    return string.split('').map(function (char) {
        return char.charCodeAt(0).toString(2);
    }).join(' ');
}
16
gnclmorais
  1. traverser la ficelle
  2. convertir chaque caractère en son code 
  3. convertir le code de caractère en binaire
  4. Poussez-le dans un tableau et ajoutez les 0 à gauche 
  5. retourne une chaîne séparée par un espace 

Code:

function textToBin(text) {
  var length = text.length,
      output = [];
  for (var i = 0;i < length; i++) {
    var bin = text[i].charCodeAt().toString(2);
    output.Push(Array(8-bin.length+1).join("0") + bin);
  } 
  return output.join(" ");
}
textToBin("!a") => "00100001 01100001"

Autrement 

function textToBin(text) {
  return (
    Array
      .from(text)
      .reduce((acc, char) => acc.concat(char.charCodeAt().toString(2)), [])
      .map(bin => '0'.repeat(8 - bin.length) + bin )
      .join(' ')
  );
}
8
alejandro
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(" "))
7
Nevir

Voici une jolie implémentation native générique, que j’ai écrite il ya quelque temps

// ABC - a generic, native JS (A)scii(B)inary(C)onverter.
// (c) 2013 Stephan Schmitz <[email protected]>
// License: MIT, http://eyecatchup.mit-license.org
// URL: https://Gist.github.com/eyecatchup/6742657
var ABC = {
  toAscii: function(bin) {
    return bin.replace(/\s*[01]{8}\s*/g, function(bin) {
      return String.fromCharCode(parseInt(bin, 2))
    })
  },
  toBinary: function(str, spaceSeparatedOctets) {
    return str.replace(/[\s\S]/g, function(str) {
      str = ABC.zeroPad(str.charCodeAt().toString(2));
      return !1 == spaceSeparatedOctets ? str : str + " "
    })
  },
  zeroPad: function(num) {
    return "00000000".slice(String(num).length) + num
  }
};

et à utiliser comme suit:

var binary1      = "01100110011001010110010101101100011010010110111001100111001000000110110001110101011000110110101101111001",
    binary2      = "01100110 01100101 01100101 01101100 01101001 01101110 01100111 00100000 01101100 01110101 01100011 01101011 01111001",
    binary1Ascii = ABC.toAscii(binary1),
    binary2Ascii = ABC.toAscii(binary2);

console.log("Binary 1:                   " + binary1);
console.log("Binary 1 to ASCII:          " + binary1Ascii);
console.log("Binary 2:                   " + binary2);
console.log("Binary 2 to ASCII:          " + binary2Ascii);
console.log("Ascii to Binary:            " + ABC.toBinary(binary1Ascii));     // default: space-separated octets
console.log("Ascii to Binary /wo spaces: " + ABC.toBinary(binary1Ascii, 0));  // 2nd parameter false to not space-separate octets

La source est sur Github (Gist): https://Gist.github.com/eyecatchup/6742657

J'espère que ça aide. N'hésitez pas à utiliser pour ce que vous voulez (enfin, au moins pour ce que MIT permet).

5
eyecatchUp

Caractères 8 bits avec le premier 0

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

Si vous avez besoin de 6 ou 7 bits, changez simplement .slice(-8)

4
Hyper

Juste un indice dans la bonne direction

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 );
4
jAndy

Les autres réponses fonctionneront dans la plupart des cas. Toutefois, il convient de noter que charCodeAt() et les fonctions associées ne fonctionnent pas avec les chaînes UTF-8 (en d’autres termes, ils génèrent des erreurs s’il existe des caractères en dehors de la plage standard ASCII). Voici une solution de contournement.

// 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 );
};

Les fonctions escape/unescape() sont obsolètes. Si vous avez besoin de polyfills pour ceux-ci, vous pouvez consulter l'exemple plus complet de codage UTF-8, disponible ici: http://jsfiddle.net/47zwb41o

2
Beejor

cela semble être la version simplifiée 

Array.from('abc').map((each)=>each.charCodeAt(0).toString(2)).join(" ")
1
Martian2049

Merci Majid Laissi pour votre réponse

J'ai créé 2 fonctions à partir de votre code:

l'objectif était de mettre en œuvre la conversion de chaîne en VARBINARY, BINARY et retour

const stringToBinary = function(string, maxBytes) {
  //for BINARY maxBytes = 255
  //for VARBINARY maxBytes = 65535
  let binaryOutput = '';
  if (string.length > maxBytes) {
    string = string.substring(0, maxBytes);
  }

  for (var i = 0; i < string.length; i++) {
    binaryOutput += string[i].charCodeAt(0).toString(2) + ' ';
  }

  return binaryOutput;
};

et conversion en arrière:

const binaryToString = function(binary) {
  const arrayOfBytes = binary.split(' ');

  let stringOutput = '';

  for (let i = 0; i < arrayOfBytes.length; i++) {
    stringOutput += String.fromCharCode(parseInt(arrayOfBytes[i], 2));
  }

  return stringOutput;
};

et voici un exemple de travail: https://jsbin.com/futalidenu/edit?js,console

0
Yarik