/* * The MIT License (MIT) * * Copyright (c) 2014-2016 Patrick Gansterer <paroga@paroga.com> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE.
*/
function encode(value) { var data = new ArrayBuffer(256); var dataView = new DataView(data); var lastLength; var offset = 0;
function prepareWrite(length) { var newByteLength = data.byteLength; var requiredLength = offset + length; while (newByteLength < requiredLength)
newByteLength <<= 1; if (newByteLength !== data.byteLength) { var oldDataView = dataView;
data = new ArrayBuffer(newByteLength);
dataView = new DataView(data); var uint32count = (offset + 3) >> 2; for (var i = 0; i < uint32count; ++i)
dataView.setUint32(i << 2, oldDataView.getUint32(i << 2));
}
lastLength = length; return dataView;
} function commitWrite() {
offset += lastLength;
} function writeFloat64(value) {
commitWrite(prepareWrite(8).setFloat64(offset, value));
} function writeUint8(value) {
commitWrite(prepareWrite(1).setUint8(offset, value));
} function writeUint8Array(value) { var dataView = prepareWrite(value.length); for (var i = 0; i < value.length; ++i)
dataView.setUint8(offset + i, value[i]);
commitWrite();
} function writeUint16(value) {
commitWrite(prepareWrite(2).setUint16(offset, value));
} function writeUint32(value) {
commitWrite(prepareWrite(4).setUint32(offset, value));
} function writeUint64(value) { var low = value % POW_2_32; var high = (value - low) / POW_2_32; var dataView = prepareWrite(8);
dataView.setUint32(offset, high);
dataView.setUint32(offset + 4, low);
commitWrite();
} function writeTypeAndLength(type, length) { if (length < 24) {
writeUint8(type << 5 | length);
} elseif (length < 0x100) {
writeUint8(type << 5 | 24);
writeUint8(length);
} elseif (length < 0x10000) {
writeUint8(type << 5 | 25);
writeUint16(length);
} elseif (length < 0x100000000) {
writeUint8(type << 5 | 26);
writeUint32(length);
} else {
writeUint8(type << 5 | 27);
writeUint64(length);
}
}
function encodeItem(value) { var i;
if (value === false) return writeUint8(0xf4); if (value === true) return writeUint8(0xf5); if (value === null) return writeUint8(0xf6); if (value === undefined) return writeUint8(0xf7);
switch (typeof value) { case"number": if (Math.floor(value) === value) { if (0 <= value && value <= POW_2_53) return writeTypeAndLength(0, value); if (-POW_2_53 <= value && value < 0) return writeTypeAndLength(1, -(value + 1));
}
writeUint8(0xfb); return writeFloat64(value);
default: var length; if (Array.isArray(value)) {
length = value.length;
writeTypeAndLength(4, length); for (i = 0; i < length; ++i)
encodeItem(value[i]);
} elseif (value instanceof Uint8Array) {
writeTypeAndLength(2, value.length);
writeUint8Array(value);
} else { var keys = Object.keys(value);
length = keys.length;
writeTypeAndLength(5, length); for (i = 0; i < length; ++i) { var key = keys[i];
encodeItem(key);
encodeItem(value[key]);
}
}
}
}
encodeItem(value);
if ("slice" in data) return data.slice(0, offset);
var ret = new ArrayBuffer(offset); var retView = new DataView(ret); for (var i = 0; i < offset; ++i)
retView.setUint8(i, dataView.getUint8(i)); return ret;
}
function decode(data, tagger, simpleValue) { var dataView = new DataView(data); var offset = 0;
function commitRead(length, value) {
offset += length; return value;
} function readArrayBuffer(length) { return commitRead(length, new Uint8Array(data, offset, length));
} function readFloat16() { var tempArrayBuffer = new ArrayBuffer(4); var tempDataView = new DataView(tempArrayBuffer); var value = readUint16();
var sign = value & 0x8000; var exponent = value & 0x7c00; var fraction = value & 0x03ff;
function decodeItem() { var initialByte = readUint8(); var majorType = initialByte >> 5; var additionalInformation = initialByte & 0x1f; var i; var length;
if (majorType === 7) { switch (additionalInformation) { case 25: return readFloat16(); case 26: return readFloat32(); case 27: return readFloat64();
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.