bytebuffer
Version:
The swiss army knife for binary data in JavaScript.
102 lines (98 loc) • 3.46 kB
JavaScript
//? if (CSTRING) {
// types/strings/cstring
/**
* Writes a NULL-terminated UTF8 encoded string. For this to work the specified string must not contain any NULL
* characters itself.
* @param {string} str String to write
* @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes
* contained in `str` + 1 if omitted.
* @returns {!ByteBuffer|number} this if offset is omitted, else the actual number of bytes written
* @expose
*/
ByteBufferPrototype.writeCString = function(str, offset) {
//? RELATIVE();
var i,
k = str.length;
if (!this.noAssert) {
if (typeof str !== 'string')
throw TypeError("Illegal str: Not a string");
for (i=0; i<k; ++i) {
if (str.charCodeAt(i) === 0)
throw RangeError("Illegal str: Contains NULL-characters");
}
//? ASSERT_OFFSET();
}
var start = offset;
// UTF8 strings do not contain zero bytes in between except for the zero character, so:
//? if (NODE) {
k = Buffer.byteLength(str, "utf8");
//? ENSURE_CAPACITY('k+1');
offset += this.buffer.write(str, offset, k, "utf8");
this.buffer[offset++] = 0;
//? } else {
k = utfx.calculateUTF16asUTF8(stringSource(str))[1];
//? ENSURE_CAPACITY('k+1');
utfx.encodeUTF16toUTF8(stringSource(str), function(b) {
this.view.setUint8(offset++, b);
}.bind(this));
this.view.setUint8(offset++, 0);
//? }
if (relative) {
this.offset = offset - start;
return this;
}
return k;
};
/**
* Reads a NULL-terminated UTF8 encoded string. For this to work the string read must not contain any NULL characters
* itself.
* @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes
* read if omitted.
* @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string
* read and the actual number of bytes read.
* @expose
*/
ByteBufferPrototype.readCString = function(offset) {
//? RELATIVE();
if (!this.noAssert) {
//? ASSERT_OFFSET(1);
}
var start = offset,
temp;
// UTF8 strings do not contain zero bytes in between except for the zero character itself, so:
//? if (NODE) {
do {
if (offset >= this.buffer.length)
throw RangeError("Index out of range: "+offset+" <= "+this.buffer.length);
temp = this.buffer[offset++];
} while (temp !== 0);
var str = this.buffer.toString("utf8", start, offset-1);
if (relative) {
this.offset = offset;
return str;
} else {
return {
"string": str,
"length": offset - start
};
}
//? } else { // getUint8 asserts on its own
var sd, b = -1;
utfx.decodeUTF8toUTF16(function() {
if (b === 0) return null;
if (offset >= this.limit)
throw RangeError("Illegal range: Truncated data, "+offset+" < "+this.limit);
return (b = this.view.getUint8(offset++)) === 0 ? null : b;
}.bind(this), sd = stringDestination(), true);
if (relative) {
this.offset = offset;
return sd();
} else {
return {
"string": sd(),
"length": offset - start
};
}
//? }
};
//? }