cos/index.js

146 lines
3.2 KiB
JavaScript
Raw Normal View History

2023-03-13 22:12:10 +03:00
/**
* 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
}
}
}