Buckets:
| export function encodeBase32UpperCase(bytes) { | |
| return encodeBase32_internal(bytes, base32UpperCaseAlphabet, EncodingPadding.Include); | |
| } | |
| export function encodeBase32UpperCaseNoPadding(bytes) { | |
| return encodeBase32_internal(bytes, base32UpperCaseAlphabet, EncodingPadding.None); | |
| } | |
| export function encodeBase32LowerCase(bytes) { | |
| return encodeBase32_internal(bytes, base32LowerCaseAlphabet, EncodingPadding.Include); | |
| } | |
| export function encodeBase32LowerCaseNoPadding(bytes) { | |
| return encodeBase32_internal(bytes, base32LowerCaseAlphabet, EncodingPadding.None); | |
| } | |
| /** Replaced: Use encodeBase32UpperCase() instead. */ | |
| export function encodeBase32(bytes) { | |
| return encodeBase32UpperCase(bytes); | |
| } | |
| /** Replaced: Use encodeBase32UpperCaseNoPadding() instead. */ | |
| export function encodeBase32NoPadding(bytes) { | |
| return encodeBase32UpperCaseNoPadding(bytes); | |
| } | |
| function encodeBase32_internal(bytes, alphabet, padding) { | |
| let result = ""; | |
| for (let i = 0; i < bytes.byteLength; i += 5) { | |
| let buffer = 0n; | |
| let bufferBitSize = 0; | |
| for (let j = 0; j < 5 && i + j < bytes.byteLength; j++) { | |
| buffer = (buffer << 8n) | BigInt(bytes[i + j]); | |
| bufferBitSize += 8; | |
| } | |
| if (bufferBitSize % 5 !== 0) { | |
| buffer = buffer << BigInt(5 - (bufferBitSize % 5)); | |
| bufferBitSize += 5 - (bufferBitSize % 5); | |
| } | |
| for (let j = 0; j < 8; j++) { | |
| if (bufferBitSize >= 5) { | |
| result += alphabet[Number((buffer >> BigInt(bufferBitSize - 5)) & 0x1fn)]; | |
| bufferBitSize -= 5; | |
| } | |
| else if (bufferBitSize > 0) { | |
| result += alphabet[Number((buffer << BigInt(6 - bufferBitSize)) & 0x3fn)]; | |
| bufferBitSize = 0; | |
| } | |
| else if (padding === EncodingPadding.Include) { | |
| result += "="; | |
| } | |
| } | |
| } | |
| return result; | |
| } | |
| export function decodeBase32(encoded) { | |
| return decodeBase32_internal(encoded, base32DecodeMap, DecodingPadding.Required); | |
| } | |
| export function decodeBase32IgnorePadding(encoded) { | |
| return decodeBase32_internal(encoded, base32DecodeMap, DecodingPadding.Ignore); | |
| } | |
| function decodeBase32_internal(encoded, decodeMap, padding) { | |
| const result = new Uint8Array(Math.ceil(encoded.length / 8) * 5); | |
| let totalBytes = 0; | |
| for (let i = 0; i < encoded.length; i += 8) { | |
| let chunk = 0n; | |
| let bitsRead = 0; | |
| for (let j = 0; j < 8; j++) { | |
| if (padding === DecodingPadding.Required) { | |
| if (encoded[i + j] === "=") { | |
| continue; | |
| } | |
| if (i + j >= encoded.length) { | |
| throw new Error("Invalid padding"); | |
| } | |
| } | |
| if (padding === DecodingPadding.Ignore) { | |
| if (i + j >= encoded.length || encoded[i + j] === "=") { | |
| continue; | |
| } | |
| } | |
| if (j > 0 && encoded[i + j - 1] === "=") { | |
| throw new Error("Invalid padding"); | |
| } | |
| if (!(encoded[i + j] in decodeMap)) { | |
| throw new Error("Invalid character"); | |
| } | |
| chunk |= BigInt(decodeMap[encoded[i + j]]) << BigInt((7 - j) * 5); | |
| bitsRead += 5; | |
| } | |
| if (bitsRead < 40) { | |
| let unused; | |
| if (bitsRead === 10) { | |
| unused = chunk & 0xffffffffn; | |
| } | |
| else if (bitsRead === 20) { | |
| unused = chunk & 0xffffffn; | |
| } | |
| else if (bitsRead === 25) { | |
| unused = chunk & 0xffffn; | |
| } | |
| else if (bitsRead === 35) { | |
| unused = chunk & 0xffn; | |
| } | |
| else { | |
| throw new Error("Invalid padding"); | |
| } | |
| if (unused !== 0n) { | |
| throw new Error("Invalid padding"); | |
| } | |
| } | |
| const byteLength = Math.floor(bitsRead / 8); | |
| for (let i = 0; i < byteLength; i++) { | |
| result[totalBytes] = Number((chunk >> BigInt(32 - i * 8)) & 0xffn); | |
| totalBytes++; | |
| } | |
| } | |
| return result.slice(0, totalBytes); | |
| } | |
| const base32UpperCaseAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; | |
| const base32LowerCaseAlphabet = "abcdefghijklmnopqrstuvwxyz234567"; | |
| const base32DecodeMap = { | |
| A: 0, | |
| B: 1, | |
| C: 2, | |
| D: 3, | |
| E: 4, | |
| F: 5, | |
| G: 6, | |
| H: 7, | |
| I: 8, | |
| J: 9, | |
| K: 10, | |
| L: 11, | |
| M: 12, | |
| N: 13, | |
| O: 14, | |
| P: 15, | |
| Q: 16, | |
| R: 17, | |
| S: 18, | |
| T: 19, | |
| U: 20, | |
| V: 21, | |
| W: 22, | |
| X: 23, | |
| Y: 24, | |
| Z: 25, | |
| a: 0, | |
| b: 1, | |
| c: 2, | |
| d: 3, | |
| e: 4, | |
| f: 5, | |
| g: 6, | |
| h: 7, | |
| i: 8, | |
| j: 9, | |
| k: 10, | |
| l: 11, | |
| m: 12, | |
| n: 13, | |
| o: 14, | |
| p: 15, | |
| q: 16, | |
| r: 17, | |
| s: 18, | |
| t: 19, | |
| u: 20, | |
| v: 21, | |
| w: 22, | |
| x: 23, | |
| y: 24, | |
| z: 25, | |
| "2": 26, | |
| "3": 27, | |
| "4": 28, | |
| "5": 29, | |
| "6": 30, | |
| "7": 31 | |
| }; | |
| var EncodingPadding; | |
| (function (EncodingPadding) { | |
| EncodingPadding[EncodingPadding["Include"] = 0] = "Include"; | |
| EncodingPadding[EncodingPadding["None"] = 1] = "None"; | |
| })(EncodingPadding || (EncodingPadding = {})); | |
| var DecodingPadding; | |
| (function (DecodingPadding) { | |
| DecodingPadding[DecodingPadding["Required"] = 0] = "Required"; | |
| DecodingPadding[DecodingPadding["Ignore"] = 1] = "Ignore"; | |
| })(DecodingPadding || (DecodingPadding = {})); | |
Xet Storage Details
- Size:
- 5.46 kB
- Xet hash:
- 444f9bdc2d7322e765f37a13498c329f00777ac9ab341abddf9e067bee58b015
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.