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))
}