我在纯JavaScript中编写了一个比特流实现。我目前代表比特为“0”和“1”的字符串 - 认为这比数组0和1更有效,我不想使用Uint32 - 并且我需要将字符串转换为和从此表示。这是我走到这一步:将字符串转换为0和1,将0和1转换为字符串的有效方法?
function uintToBitString(uint, bit_length) {
var res = uint.toString(2);
if (res.length > bit_length) {
throw new Error("The number " + uint + " is too big to fit in " +
bit_length + " bits");
}
if (res.length < bit_length) {
res = Array(bit_length - res.length + 1).join("0") + res;
}
return res;
}
function stringToBinRep(val) {
var bit_pieces = [];
for (var i=0; i < val.length; i++) {
bit_pieces[i] = uintToBitString(val.charCodeAt(i), 8);
}
return bit_pieces.join("");
}
function binRepToString(bits) {
var charCodes = [];
for (var i=0; i < bits.length; i += 8) {
charCodes[i/8] = parseInt(bits.slice(i, i+8), 2);
}
return String.fromCharCode.apply(String, charCodes);
}
虽然我熟悉JavaScript我没有什么让更快的代码与慢的代码十分精通。有没有更有效的方式来使用纯粹的JavaScript来完成上述操作?
是不是一个字符串实现为一个字符数组? – 2013-05-02 21:20:09
@DavinTryon:可能,是的。但是呢?我必须能够读/写'n%8!== 0'的'n'位。这只是我正在编写的比特流协议的一部分。 – Claudiu 2013-05-02 21:25:13
我只是好奇你的评论是关于在数组上使用字符串更有效。我不是一个真正的js家伙,但我已经看到了一些关于字符串concat表现比array.join更好的文章。 – 2013-05-02 21:28:40