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?
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/
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(' ');
}
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(' ')
);
}
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(" "))
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).
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)
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 );
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
cela semble être la version simplifiée
Array.from('abc').map((each)=>each.charCodeAt(0).toString(2)).join(" ")
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