2013-05-02 318 views
3

我在纯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来完成上述操作?

+0

是不是一个字符串实现为一个字符数组? – 2013-05-02 21:20:09

+0

@DavinTryon:可能,是的。但是呢?我必须能够读/写'n%8!== 0'的'n'位。这只是我正在编写的比特流协议的一部分。 – Claudiu 2013-05-02 21:25:13

+0

我只是好奇你的评论是关于在数组上使用字符串更有效。我不是一个真正的js家伙,但我已经看到了一些关于字符串concat表现比array.join更好的文章。 – 2013-05-02 21:28:40

回答

2

uintToBitString一个明显的改善将是像

function uintToBitString(uint, bit_length) { 
    var max = 1 << bit_length; 
    if(uint >= max) 
     throw new Error("The number " + uint + " is too big to fit in " + 
         bit_length + " bits"); 
    return (uint | max).toString(2).substring(1); 
} 

至于另外两个人,我宁愿使用String.replace有:

function stringToBinRep(val) { 
    return val.replace(/./g, function($0) { 
     return uintToBitString($0.charCodeAt(0), 8) 
    }) 
} 

function binRepToString(bits) { 
    return bits.replace(/.{8}/g, function($0) { 
     return String.fromCharCode(parseInt($0, 2)) 
    }) 
} 

也就是说,如果性能真的很重要,你应该使用ints进行位操作,而不是1/0字符串。

+0

不错!不会想到这个 – Claudiu 2013-05-02 21:49:20

+0

感谢'.replace'变体。我会尝试一下,看看表现如何。你是对的,我确实应该使用位操作。我会看看是否有必要做我正在做的事情。那么在那种情况下,我会处理32位整数的数组? (所以我只需要4个字节的32位,而不是32个字节) – Claudiu 2013-05-02 22:16:35

+0

是的,情况就是这样。如果处理unicode字符串,请注意字符!= byte。 – georg 2013-05-02 22:21:14

相关问题