EN
JavaScript - get and set bits in byte array
12 points
In this article, we would like to show how in JavaScript get and set bits in a byte array.
To understand the below code it is necessary to know how bytes and bits are indexed.
xxxxxxxxxx
1
NOTATION (the way we write and address bytes and bits):
2
3
// Byte index: 0 1 2
4
// Bit index: |7 |0 |15 |8 |23 |16
5
// v v v v v v
6
// DEC values: 170, 175, 10 BIN values: 10101010 10101111 00001010
Practical example:
xxxxxxxxxx
1
function getBits(number, length) {
2
var text = '';
3
for (var i = length - 1; i > -1; --i) {
4
text += 0x01 & (number >> i);
5
}
6
return text;
7
}
8
9
function BitArray(byteArray) {
10
this.getSize = function() {
11
return 8 * byteArray.length;
12
};
13
this.getBit = function(index) {
14
var byteIndex = Math.floor(index / 8);
15
var bitIndex = index - 8 * byteIndex;
16
var byteValue = byteArray[byteIndex];
17
if (byteValue < 0 || byteValue > 255) {
18
throw new Error('Array item must be byte (in range: 0-255).');
19
}
20
var bitValue = (byteValue >>> bitIndex) & 0x01;
21
return bitValue;
22
};
23
this.setBit = function(index, value) {
24
var byteIndex = Math.floor(index / 8);
25
var bitIndex = index - 8 * byteIndex;
26
var byteValue = byteArray[byteIndex];
27
if (byteValue < 0 || byteValue > 255) {
28
throw new Error('Array item must be byte (in range: 0-255).');
29
}
30
var maskValue = 0x01 << bitIndex;
31
byteArray[byteIndex] = value ? (byteValue | maskValue) : (byteValue & ~maskValue);
32
};
33
this.toString = function(delimiter) {
34
if (delimiter == null) {
35
delimiter = ' ';
36
}
37
var result = '';
38
for (var i = 0; i < byteArray.length; ++i) {
39
if (i > 0) {
40
result += delimiter;
41
}
42
var byte = byteArray[i];
43
if (byte < 0 || byte > 255) {
44
throw new Error('Array item must be byte (in range: 0-255).');
45
}
46
result += getBits(byte, 8);
47
}
48
return result;
49
};
50
}
51
52
53
// Usage example:
54
55
// Byte index: 0 1 2
56
// Bit index: |7 |0 |15 |8 |23 |16
57
// | | | | | |
58
// DEC: BIN: v v v v v v
59
var byteArray = [170, 175, 10]; // [10101010, 10101111, 00001010]
60
61
var bitArray = new BitArray(byteArray);
62
63
// bits getting:
64
65
console.log(0 + '\t' + bitArray.getBit(0)); // 0 0
66
console.log(1 + '\t' + bitArray.getBit(1)); // 1 1
67
console.log(2 + '\t' + bitArray.getBit(2)); // 2 0
68
console.log(3 + '\t' + bitArray.getBit(3)); // 3 1
69
70
console.log(bitArray.toString()); // 10101010 10101111 00001010
71
72
// bits setting (before: 10101010, after: 10100101):
73
74
bitArray.setBit(0, 1);
75
bitArray.setBit(1, 0);
76
bitArray.setBit(2, 1);
77
bitArray.setBit(3, 0);
78
79
console.log(byteArray[0]); // 165 <--- DEC
80
81
// |7 |0
82
// | |
83
// v v
84
console.log(getBits(byteArray[0], 8)); // 10100101 <-- BIN