Javascript examping of encoding to a TLV (tag-length-value)
function encodeTLV (tag, value) {
var buffer = []; // array of bytes
if (tag > 0xFF) { // check if tag is multi-byte
do {
buffer.unshift(tag & 0xFF); // write last byte of tag
tag >>= 8; // remove last byte of tag
} while (tag); // until tag is zero
buffer[0] |= 0x80; // set bit 7 of first byte of tag
} else {
buffer.push(tag); // write one byte for tag
}
var length = value.length; // get length of value in bytes
if (length > 0x7F) { // check if length is multi-byte
var bytes = Math.ceil(Math.log2(length + 1) / 8); // number of bytes for length
buffer.push(0x80 | bytes); // write one byte with bit 7 set and number of bytes for length
for (var i = bytes - 1; i >= 0; i--) {
buffer.push((length >> (8 * i)) & 0xFF); // write more bytes for length
}
} else {
buffer.push(length); // write one byte for length
}
buffer = buffer.concat(value); // append value bytes to buffer
return Buffer.from(buffer); // return buffer as a Buffer object
}