63 lines
1.3 KiB
JavaScript
63 lines
1.3 KiB
JavaScript
// Encoding to encode/decode data with Hamming Error Correction
|
|
export const DECODED_SIZE = 4;
|
|
export const ENCODED_SIZE = 7;
|
|
|
|
export const blockSize = () => ({
|
|
encoded: ENCODED_SIZE,
|
|
decoded: DECODED_SIZE
|
|
});
|
|
|
|
export const encode = (bits) => {
|
|
const encodedBits = [];
|
|
for(let i = 0; i < bits.length; i+= DECODED_SIZE) {
|
|
const block = bits.slice(i, i + DECODED_SIZE);
|
|
encodedBits.push(...encodeBlock(block));
|
|
}
|
|
return encodedBits;
|
|
}
|
|
export const decode = bits => {
|
|
const decodedBits = [];
|
|
for(let i = 0; i < bits.length; i += ENCODED_SIZE) {
|
|
const block = bits.slice(i, i + ENCODED_SIZE);
|
|
decodedBits.push(...decodeBlock(block));
|
|
}
|
|
return decodedBits;
|
|
}
|
|
|
|
const encodeBlock = ([a = 0, b = 0, c = 0, d = 0]) => {
|
|
// embed parity bits
|
|
return [
|
|
a ^ b ^ d,
|
|
a ^ c ^ d,
|
|
a,
|
|
b ^ c ^ d,
|
|
b,
|
|
c,
|
|
d
|
|
]
|
|
}
|
|
|
|
const decodeBlock = ([
|
|
p0 = 0,
|
|
p1 = 0,
|
|
a = 0,
|
|
p2 = 0,
|
|
b = 0,
|
|
c = 0,
|
|
d = 0
|
|
]) => {
|
|
// check parity bits
|
|
const e0 = p0 ^ a ^ b ^ d;
|
|
const e1 = p1 ^ a ^ c ^ d;
|
|
const e2 = p2 ^ b ^ c ^ d;
|
|
let error = (e2 << 2) | (e1 << 1) | e0;
|
|
// flip the bit
|
|
switch(error) {
|
|
case 0b011: a ^= 1; break;
|
|
case 0b101: b ^= 1; break;
|
|
case 0b110: c ^= 1; break;
|
|
case 0b111: d ^= 1; break;
|
|
default: break;
|
|
}
|
|
return [a, b, c, d];
|
|
} |