JavaScriptでテキスト領域のテキストをバイナリコードに変換したいです。
たとえば、ユーザーがテキストエリアに「TEST
」と入力した場合、値「01010100 01000101 01010011 01010100
"が返されます。
Switchステートメントを使用して各文字にバイナリコード値を割り当てることは避けたい(例:case "T": return "01010100
)または他の同様の手法。
ここに JSFiddle があります。これはネイティブJavaScriptで可能ですか?
すべきことは、charCodeAt
関数を使用してすべての文字を変換し、10進数のASCIIコードを取得することです。その後、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/
これはあなたが得ることができる最も簡単なものかもしれません:
function text2Binary(string) {
return string.split('').map(function (char) {
return char.charCodeAt(0).toString(2);
}).join(' ');
}
コード:
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"
別の方法
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(" "))
これはかなり一般的なネイティブ実装で、 先ほど書いた
// 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
}
};
そして、次のように使用されます。
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
ソースはGithub(Gist)にあります: https://Gist.github.com/eyecatchup/6742657
それが役に立てば幸い。自由に使用してください(まあ、少なくとも何でもMIT permit))。
先行0の8ビット文字
_'sometext'
.split('')
.map((char) => '00'.concat(char.charCodeAt(0).toString(2)).slice(-8))
.join(' ');
_
6または7ビットが必要な場合は、.slice(-8)
を変更するだけです
正しい方向へのヒント
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 );
他の回答は、ほとんどの場合に機能します。ただし、charCodeAt()
および関連は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()
関数は非推奨です。それらにポリフィルが必要な場合は、ここにあるより包括的なUTF-8エンコーディングの例を確認できます。 http://jsfiddle.net/47zwb41o
これは簡易版のようです
Array.from('abc').map((each)=>each.charCodeAt(0).toString(2)).join(" ")
ありがとうMajid Laissiありがとう answer
コードから2つの関数を作成しました。
目標は、文字列のVARBINARY、BINARYへの変換を実装することでした
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;
};
および逆変換:
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;
};
そして、ここに実例があります: https://jsbin.com/futalidenu/edit?js,console