146 lines
3.2 KiB
JavaScript
146 lines
3.2 KiB
JavaScript
|
/**
|
||
|
* Get one bit on a byte
|
||
|
*
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* getBIT(ABCDEFGH, 3) ==> E
|
||
|
*/
|
||
|
function getBIT(byte, order)
|
||
|
{
|
||
|
return (byte >> order) & 1
|
||
|
}
|
||
|
/**
|
||
|
* Update one bit on a byte
|
||
|
*
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* setBIT(ABCDEFGH, 3, 0) ==> ABCD0FGH
|
||
|
* setBIT(ABCDEFGH, 3, 1) ==> ABCD1FGH
|
||
|
*/
|
||
|
function setBIT(byte, order, value)
|
||
|
{
|
||
|
return (
|
||
|
value == 0
|
||
|
) ? (
|
||
|
byte & (( 1 << order ) ^ 255)
|
||
|
) : (
|
||
|
byte | ( 1 << order )
|
||
|
);
|
||
|
};
|
||
|
/**
|
||
|
* Explode byte of per bits and given Function
|
||
|
* and anonymous returning value is result
|
||
|
*
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* explodeBits(ABCDEFGH, (A, B, C, D, E, F, G, H) => {
|
||
|
* return A
|
||
|
* }) ===> A
|
||
|
*
|
||
|
*/
|
||
|
function explodeBits(bytes, map)
|
||
|
{
|
||
|
return map(
|
||
|
(bytes >> 7 & 1),
|
||
|
(bytes >> 6 & 1),
|
||
|
(bytes >> 5 & 1),
|
||
|
(bytes >> 4 & 1),
|
||
|
(bytes >> 3 & 1),
|
||
|
(bytes >> 2 & 1),
|
||
|
(bytes >> 1 & 1),
|
||
|
bytes & 1
|
||
|
)
|
||
|
}
|
||
|
/**
|
||
|
* Explode byte of per bits and given Function
|
||
|
* and anonymous returning value is result
|
||
|
*
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* implodeByte(A,B,C,D,E,F,G,H) ===> ABCDEFGH
|
||
|
*/
|
||
|
function implodeByte(a,b,c,d,e,f,g,h)
|
||
|
{
|
||
|
return (a << 7) | (b << 6) | (c << 5) | (d << 4) | (e << 3) | (f << 2) | (g << 1) | h
|
||
|
}
|
||
|
/**
|
||
|
* Explode byte of per bits and given Function
|
||
|
* and anonymous returning value is result
|
||
|
*
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* explodeBits(ABCDEFGH, (A0000000, 0B000000, 00C00000, 000D0000, 0000E000, 00000F00, 000000G0, 0000000H) => {
|
||
|
* return A
|
||
|
* }) ===> A
|
||
|
*
|
||
|
*/
|
||
|
function explodeBitValue(bytes, map)
|
||
|
{
|
||
|
return map(
|
||
|
(bytes >> 7 & 1) << 7,
|
||
|
(bytes >> 6 & 1) << 6,
|
||
|
(bytes >> 5 & 1) << 5,
|
||
|
(bytes >> 4 & 1) << 4,
|
||
|
(bytes >> 3 & 1) << 3,
|
||
|
(bytes >> 2 & 1) << 2,
|
||
|
(bytes >> 1 & 1) << 1,
|
||
|
bytes & 1
|
||
|
)
|
||
|
}
|
||
|
/**
|
||
|
* Explode byte of per bits and given Function
|
||
|
* and anonymous returning value is result
|
||
|
*
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* implodeByte(A0000000, 0B000000, 00C00000, 000D0000, 0000E000, 00000F00, 000000G0, 0000000H) ===> ABCDEFGH
|
||
|
*/
|
||
|
function implodeBitValues(a,b,c,d,e,f,g,h)
|
||
|
{
|
||
|
return a | b | c | d | e | f | g | h
|
||
|
}
|
||
|
/**
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* rightShift(ABCDEFGH) ==> HABCDEFG
|
||
|
*/
|
||
|
function rightShift(byte)
|
||
|
{
|
||
|
return explodeBits(byte, (a,b,c,d,e,f,g,h) => {
|
||
|
return implodeByte(h,a,b,c,d,e,f,g)
|
||
|
})
|
||
|
}
|
||
|
/**
|
||
|
* This is a byte of bits ===> ABCDEFGH
|
||
|
*
|
||
|
* leftShift(ABCDEFGH) ==> BCDEFGHA
|
||
|
*/
|
||
|
function leftShift(byte)
|
||
|
{
|
||
|
return explodeBits(byte, (a,b,c,d,e,f,g,h) => {
|
||
|
return implodeByte(b,c,d,e,f,g,h,a)
|
||
|
})
|
||
|
}
|
||
|
/**
|
||
|
* eachBlock([A,B,C,D,E,F,G,H], 3) ==> [A,B,C],[D,E,F],[G,H]
|
||
|
*/
|
||
|
function * eachBlock(bytesArray, size)
|
||
|
{
|
||
|
let current = 0;
|
||
|
while(1)
|
||
|
{
|
||
|
let currentOffset = current * size;
|
||
|
let currentOffsetEnd = current * size + size;
|
||
|
let result = bytesArray.slice(
|
||
|
currentOffset,
|
||
|
currentOffsetEnd
|
||
|
);
|
||
|
if(result.length + size <= size)
|
||
|
{
|
||
|
return result
|
||
|
}else{
|
||
|
current++;
|
||
|
yield result
|
||
|
}
|
||
|
}
|
||
|
}
|