97 lines
3.1 KiB
JavaScript
97 lines
3.1 KiB
JavaScript
'use strict';
|
||
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
String.prototype.removeEndNullBytes = function() {
|
||
return this.replace(/\0+$/g, '');
|
||
}
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
String.prototype.removeStartNullBytes = function() {
|
||
return this.replace(/^\0+/g, '');
|
||
}
|
||
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
var bin =
|
||
{
|
||
enc : new TextEncoder("utf-8"),
|
||
dec : new TextDecoder("utf-8", {fatal: true}),
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
intFromBytes : function(bytes)
|
||
{
|
||
var value = null;
|
||
if (bytes!=null && bytes.length > 0) {
|
||
// Big Endian
|
||
for (var i = value = 0, lim = bytes.length; i < lim; i++) {
|
||
value = value * 256 + bytes[i];
|
||
}
|
||
}
|
||
return value;
|
||
},
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
bytesFromInt : function(value, size)
|
||
{
|
||
var bytes = new Uint8Array(size);
|
||
while (value) {
|
||
bytes.set([value & 255], --size);
|
||
value >>= 8;
|
||
}
|
||
return bytes;
|
||
},
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
pack : function(size, type, value)
|
||
{
|
||
var packed = null
|
||
if (type == 'n' || type == 'N') {
|
||
// js int max on 32 signed bits
|
||
if (value >= 0 && value <= 2147483647) {
|
||
packed = this.bytesFromInt(value, type == 'n' ? 2 : 4);
|
||
}
|
||
}
|
||
else if (type == 'a') {
|
||
packed = new Uint8Array(size);
|
||
packed.set(this.enc.encode(value), 0);
|
||
}
|
||
return packed;
|
||
},
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
unpack : function(size, type, bytes)
|
||
{
|
||
var unpacked = null
|
||
if (type == 'n' || type == 'N') {
|
||
var selByte = bytes.slice(0, size*(type == 'n' ? 2 : 4));
|
||
unpacked = this.intFromBytes(selByte);
|
||
}
|
||
else if (type == 'a') {
|
||
unpacked = this.dec.decode(bytes.slice(0, size)).removeEndNullBytes();
|
||
}
|
||
return unpacked;
|
||
},
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
mergeBuffers : function(bufferArray)
|
||
{
|
||
var maxLength = 0;
|
||
for(var i=0, lim=bufferArray.length; i < lim; i++) {
|
||
if (bufferArray[i] != null) {
|
||
maxLength += bufferArray[i].byteLength;
|
||
}
|
||
}
|
||
var tmp = new Uint8Array(maxLength);
|
||
for(var i=0, pos = 0, lim=bufferArray.length; i < lim; i++) {
|
||
if (bufferArray[i] != null) {
|
||
tmp.set(new Uint8Array(bufferArray[i]), pos);
|
||
pos += bufferArray[i].byteLength;
|
||
}
|
||
}
|
||
return tmp;
|
||
},
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
getBuffer : function(array, size)
|
||
{
|
||
var buffer = new Uint8Array(!size ? array.length : size);
|
||
buffer.set(new Uint8Array(array), 0);
|
||
return buffer;
|
||
},
|
||
}
|
||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
require('./file')(bin);
|
||
module.exports = bin;
|