import { Cbor } from "./"; const read = (value: string) => { if (value.charAt(0) === "4") { return value.substring( 2, 2 + parseInt(Cbor.read(value.substring(1, 2)), 16) * 2 ); } else if (value.charAt(0) === "5") { switch (value.charAt(1).toLowerCase()) { case "8": return value.substring( 4, 4 + parseInt(Cbor.read(value.substring(2, 4)), 16) * 2 ); case "9": return value.substring( 4, 4 + parseInt(Cbor.read(value.substring(2, 6)), 16) * 2 ); case "a": return value.substring( 4, 4 + parseInt(Cbor.read(value.substring(2, 10)), 16) * 2 ); case "b": return value.substring( 4, 4 + parseInt(Cbor.read(value.substring(2, 18)), 16) * 2 ); case "f": throw "Unsupported byte size"; // TODO: Read byte until a break is found to determine the size default: const size = parseInt(Cbor.read(value.substring(1, 2)), 16); return value.substring(2, 2 + (size + 16) * 2); } } else { console.trace("invalid byte", value); throw "Not a byte"; } }; const getLength = (value: string) => { const firstByte = Cbor.read(value); if (firstByte === "58") { return 4 + parseInt(value.substring(2, 4), 16) * 2; } else if (firstByte === "59") { return 6 + parseInt(value.substring(2, 6), 16) * 2; } else if (firstByte === "5a") { return 10 + parseInt(value.substring(2, 10), 16) * 2; } else if (firstByte === "5b") { return 18 + parseInt(value.substring(2, 18), 16) * 2; } else if (value.charAt(0) === "4") { return 2 + parseInt(value.substring(1, 2), 16) * 2; } else if (value.charAt(0) === "5") { return 2 + (parseInt(value.substring(1, 2), 16) + 16) * 2; } else { throw "Not a byte"; } }; const encode = (value: string): string => { const byteLength = value.length / 2; if (byteLength <= 15) { return `4${byteLength.toString(16)}${value}`; } else if (byteLength >= 16 && byteLength <= 23) { return `5${(byteLength - 16).toString(16)}${value}`; } else if (byteLength >= 24 && byteLength <= 255) { return `58${byteLength.toString(16).padStart(2, "0")}${value}`; } else if (byteLength >= 256 && byteLength <= 65535) { return `59${byteLength.toString(16).padStart(4, "0")}${value}`; } else { throw "Byte is too long, not supported."; } }; export const CborByte = { read, encode, getLength, };