UNPKG

bops

Version:
135 lines (100 loc) 2.28 kB
module.exports = from var base64 = require('base64-js') var decoders = { hex: from_hex , utf8: from_utf , base64: from_base64 } function from(source, encoding) { if(Array.isArray(source)) { return new Uint8Array(source) } return decoders[encoding || 'utf8'](source) } function from_hex(str) { var size = str.length / 2 , buf = new Uint8Array(size) , character = '' for(var i = 0, len = str.length; i < len; ++i) { character += str.charAt(i) if(i > 0 && (i % 2) === 1) { buf[i>>>1] = parseInt(character, 16) character = '' } } return buf } function from_utf(str) { var arr = [] , code for(var i = 0, len = str.length; i < len; ++i) { code = fixed_cca(str, i) if(code === false) { continue } if(code < 0x80) { arr[arr.length] = code continue } codepoint_to_bytes(arr, code) } return new Uint8Array(arr) } function codepoint_to_bytes(arr, code) { // find MSB, use that to determine byte count var copy_code = code , bit_count = 0 , byte_count , prefix , _byte , pos do { ++bit_count } while(copy_code >>>= 1) byte_count = Math.ceil((bit_count - 1) / 5) | 0 prefix = [0, 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc][byte_count] pos = [0, 0, 3, 4, 5, 6, 7][byte_count] _byte |= prefix bit_count = (7 - pos) + 6 * (byte_count - 1) while(bit_count) { _byte |= +!!(code & (1 << bit_count)) << (7 - pos) ++pos if(pos % 8 === 0) { arr[arr.length] = _byte _byte = 0x80 pos = 2 } --bit_count } if(pos) { _byte |= +!!(code & 1) << (7 - pos) arr[arr.length] = _byte } } function pad(str) { while(str.length < 8) { str = '0' + str } return str } function fixed_cca(str, idx) { idx = idx || 0 var code = str.charCodeAt(idx) , lo , hi if(0xD800 <= code && code <= 0xDBFF) { lo = str.charCodeAt(idx + 1) hi = code if(isNaN(lo)) { throw new Error('High surrogate not followed by low surrogate') } return ((hi - 0xD800) * 0x400) + (lo - 0xDC00) + 0x10000 } if(0xDC00 <= code && code <= 0xDFFF) { return false } return code } function from_base64(str) { return new Uint8Array(base64.toByteArray(str)) }