2013-08-06 3 views
1

Как я могу взять октет из буфера и превратить его в двоичную последовательность? Я хочу декодировать протокол rfc1035 через node.js, но с трудом работать с битами.node.js - разрезать байт на биты

Вот код, но он меня не устраивает - потому что это черный ящик для меня:

var sliceBits = function(b, off, len) { 
    var s = 7 - (off + len - 1); 

    b = b >>> s; 
    return b & ~(0xff << len); 
}; 

ответ

2

Используйте bitmask, октет составляет 8 бит, так что вы можете сделать что-то вроде следующего:

for (var i = 7; i >= 0; i--) { 
    var bit = octet & (1 << i) ? 1 : 0; 
    // do something with the bit (push to an array if you want a sequence) 
} 

Пример: http://jsfiddle.net/3NUVq/

Вы могли бы сделать это более эффективным, но подход очень прост. Это перемещается по смещению i, от 7 до 0 и находит i-й бит, используя битмаску 1 << i. Если установлен i-й бит, то bit будет 1, в противном случае это будет 0.

+0

спасибо, я просто скопирую один октет и использую код tmpByte = tmpSlice.toString ('ascii', 0, 1) .charCodeAt (0); var octet = tmpByte; – Kolomnitcki

+1

Другая альтернатива без тернарного оператора: for (var i = 0; i <8; i ++) {var bit = октет >> 7 - i & 1; ...} –

+0

Хорошее предложение, я уверен, что это более эффективно. –

Смежные вопросы