Initial working version
This commit is contained in:
+69
@@ -0,0 +1,69 @@
|
||||
function toArrayBuffer(buffer) {
|
||||
var arrayBuffer = new ArrayBuffer(buffer.length);
|
||||
var view = new Uint8Array(arrayBuffer);
|
||||
for (var i = 0; i < buffer.length; ++i) {
|
||||
view[i] = buffer[i];
|
||||
}
|
||||
return arrayBuffer;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
trimNull: function(s) {
|
||||
return s.replace(/\u0000+$/, '');
|
||||
},
|
||||
|
||||
createView: function(buffer) {
|
||||
if (typeof(Buffer) !== 'undefined' && buffer instanceof Buffer) {
|
||||
//convert nodejs buffers to ArrayBuffer
|
||||
buffer = toArrayBuffer(buffer);
|
||||
}
|
||||
|
||||
if (!(buffer instanceof ArrayBuffer)) {
|
||||
throw new Error('Expected instance of Buffer or ArrayBuffer');
|
||||
}
|
||||
|
||||
return new DataView(buffer);
|
||||
},
|
||||
|
||||
readBytes: function(view, offset, length, target) {
|
||||
if (offset + length < 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
var bytes = [];
|
||||
var max = Math.min(offset + length, view.byteLength);
|
||||
for (var i = offset; i < max; i++) {
|
||||
var value = view.getUint8(i);
|
||||
bytes.push(value);
|
||||
if (target) {
|
||||
target.setUint8(i - offset, value);
|
||||
}
|
||||
}
|
||||
|
||||
return bytes;
|
||||
},
|
||||
|
||||
readAscii: function(view, offset, length) {
|
||||
if (view.byteLength < offset + length) {
|
||||
return '';
|
||||
}
|
||||
var s = '';
|
||||
for (var i = 0; i < length; i++) {
|
||||
s += String.fromCharCode(view.getUint8(offset + i));
|
||||
}
|
||||
|
||||
return s;
|
||||
},
|
||||
|
||||
readUtf8: function(view, offset, length) {
|
||||
if (view.byteLength < offset + length) {
|
||||
return '';
|
||||
}
|
||||
|
||||
var buffer = view.buffer.slice(offset, offset + length);
|
||||
|
||||
//http://stackoverflow.com/a/17192845 - convert byte array to UTF8 string
|
||||
var encodedString = String.fromCharCode.apply(null, new Uint8Array(buffer));
|
||||
return decodeURIComponent(escape(encodedString));
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user