UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

67 lines 4.39 kB
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=