在javascript中将字节数组转换为string
如何将字节数组转换为string?
我发现这些function是相反的:
function string2Bin(s) { var b = new Array(); var last = s.length; for (var i = 0; i < last; i++) { var d = s.charCodeAt(i); if (d < 128) b[i] = dec2Bin(d); else { var c = s.charAt(i); alert(c + ' is NOT an ASCII character'); b[i] = -1; } } return b; } function dec2Bin(d) { var b = ''; for (var i = 0; i < 8; i++) { b = (d%2) + b; d = Math.floor(d/2); } return b; }
但是,我如何才能以另一种方式获得function?
谢谢。
邵
您需要将每个八位字节parsing回数字,然后使用该值来获取字符,如下所示:
function bin2String(array) { var result = ""; for (var i = 0; i < array.length; i++) { result += String.fromCharCode(parseInt(array[i], 2)); } return result; } bin2String(["01100110", "01101111", "01101111"]); // "foo" // Using your string2Bin function to test: bin2String(string2Bin("hello world")) === "hello world";
编辑:是的,你目前的string2Bin
可以写得更快:
function string2Bin(str) { var result = []; for (var i = 0; i < str.length; i++) { result.push(str.charCodeAt(i).toString(2)); } return result; }
但通过查看你链接的文档,我认为setBytesParameter
方法期望blob数组包含十进制数字,而不是一个位串 ,所以你可以写这样的东西:
function string2Bin(str) { var result = []; for (var i = 0; i < str.length; i++) { result.push(str.charCodeAt(i)); } return result; } function bin2String(array) { return String.fromCharCode.apply(String, array); } string2Bin('foo'); // [102, 111, 111] bin2String(string2Bin('foo')) === 'foo'; // true
只需apply
您的字节数组应用于String.fromCharCode
。 例如
String.fromCharCode.apply(null, [102, 111, 111])
等于'foo'。
注意:适用于比65535短的数组。MDN文档在这里 。
那string2Bin可以写的更简洁,没有任何循环,开机!
function string2Bin ( str ) { return str.split("").map( function( val ) { return val.charCodeAt( 0 ); } ); }
我认为这会更有效率:
function toBinString (arr) { var uarr = new Uint8Array(arr.map(function(x){return parseInt(x,2)})); var strings = [], chunksize = 0xffff; // There is a maximum stack size. We cannot call String.fromCharCode with as many arguments as we want for (var i=0; i*chunksize < uarr.length; i++){ strings.push(String.fromCharCode.apply(null, uarr.subarray(i*chunksize, (i+1)*chunksize))); } return strings.join(''); }
即使我有点迟,我认为未来的用户可以分享一些使用ES6的单线程实现。
有一件事情我认为很重要,取决于你的环境,或者你将要用数据做什么,就是保留完整的字节值。 例如, (5).toString(2)
会给你101
,但是完整的二进制转换实际上是00000101
,这就是为什么你可能需要创build一个leftPad
实现来填充前导零的string字节。 但是你可能根本不需要它,就像其他的答案一样。
如果你运行下面的代码片段,你会看到第一个输出是将abc
string转换为一个字节数组,然后将所述数组重新转换为相应的string。
// For each byte in our array, retrieve the char code value of the binary value const binArrayToString = array => array.map(byte => String.fromCharCode(parseInt(byte, 2))).join('') // Basic left pad implementation to ensure string is on 8 bits const leftPad = str => str.length < 8 ? (Array(8).join('0') + str).slice(-8) : str // For each char of the string, get the int code and convert it to binary. Ensure 8 bits. const stringToBinArray = str => str.split('').map(c => leftPad(c.charCodeAt().toString(2))) const array = stringToBinArray('abc') console.log(array) console.log(binArrayToString(array))