@iotize/tap
Version:
IoTize Device client for Javascript
67 lines • 4.39 kB
JavaScript
export const BYTE_SWAP_ORDER_REGEX = /^(B[0-9]+)(_B[0-9]+)*$/;
export class ByteSwapConverter {
constructor(order) {
this.order = order;
}
encode(input) {
return swapBytes(input, this.order);
}
decode(input) {
return this.encode(input);
}
}
/**
* Swap byte position
* B0 represents the first byte from the right
* BN represents the N byte from the right
*
* This function is symetric
*
* Example:
* ```typescript
* const input = Uint8Array.from([1,2,3,4]);
* expect(swapBytes(input, 'B2_B3_B0_B1')).to.be.deep.eq(Uint8Array.from([2,1,4,3]));
* ```
*
* @param input array
* @param order string that defined how to swap bytes
* @return a new array with byte swap
*/
export function swapBytes(input, order) {
if (!order.match(BYTE_SWAP_ORDER_REGEX)) {
throw new Error(`swatpBytes error, invalid byte order "${order}". Should match regex ${BYTE_SWAP_ORDER_REGEX}`);
}
const parts = order.split('_');
// // Create a mapping between byte number and byte position
// // For example B0_B3_B1
// // Will give mapping
// // { B0: 0, B3: 1, B1: 2 }
// const indexMap: { [key: string]: number } = parts.reduce(
// (accumulator: { [key: string]: number }, current: string, index: number) => {
// accumulator[current] = index;
// return accumulator;
// },
// {}
// );
// if (parts.length !== input.length) {
// throw new Error(
// `swatpBytes error: ${parts.length} bytes but found ${input.length} bytes`
// );
// }
const result = new Uint8Array(parts.length);
// let maxLength = Math.min(parts.length, input.length)
for (let index = 0; index < result.length; index++) {
const prevByteIndex = parseInt(parts[index].substr(1));
if (prevByteIndex >= input.length) {
throw new Error(`swapBytes error, byte index ${prevByteIndex} is out of range (input length is ${input.length} byte(s))`);
}
result[index] = input[input.length - prevByteIndex - 1];
// const byteIndex = (result.length - index - 1);
// const newIndex = indexMap['B' + byteIndex];
// if (newIndex !== undefined) {
// result[newIndex] = input[index];
// }
}
return result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnl0ZS1zd2FwLWNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NsaWVudC9pbXBsL3NyYy9saWIvY29udmVydGVyL2JvZHkvYnl0ZS1zd2FwLWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztBQUU5RCxNQUFNLE9BQU8saUJBQWlCO0lBRzVCLFlBQW1CLEtBQWE7UUFBYixVQUFLLEdBQUwsS0FBSyxDQUFRO0lBQUcsQ0FBQztJQUVwQyxNQUFNLENBQUMsS0FBaUI7UUFDdEIsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBaUIsRUFBRSxLQUFhO0lBQ3hELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FDYix5Q0FBeUMsS0FBSyx5QkFBeUIscUJBQXFCLEVBQUUsQ0FDL0YsQ0FBQztLQUNIO0lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQiw0REFBNEQ7SUFDNUQsMEJBQTBCO0lBQzFCLHVCQUF1QjtJQUN2Qiw2QkFBNkI7SUFDN0IsNERBQTREO0lBQzVELG9GQUFvRjtJQUNwRix3Q0FBd0M7SUFDeEMsOEJBQThCO0lBQzlCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsS0FBSztJQUNMLHVDQUF1QztJQUN2Qyx1QkFBdUI7SUFDdkIsb0ZBQW9GO0lBQ3BGLFNBQVM7SUFDVCxJQUFJO0lBQ0osTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLHVEQUF1RDtJQUN2RCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNsRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksYUFBYSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQkFBK0IsYUFBYSxxQ0FBcUMsS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUN6RyxDQUFDO1NBQ0g7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXhELGlEQUFpRDtRQUNqRCw4Q0FBOEM7UUFDOUMsZ0NBQWdDO1FBQ2hDLHVDQUF1QztRQUN2QyxJQUFJO0tBQ0w7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIn0=