MCPcopy Create free account
hub / github.com/Serial-Studio/Serial-Studio / decodeMessagePack

Function decodeMessagePack

app/rcc/scripts/parser/js/messagepack.js:53–184  ·  view source on GitHub ↗

* Decodes a MessagePack value starting at the given offset. * Returns an object with the decoded value and the new offset.

(data, offset)

Source from the content-addressed store, hash-verified

51 * Returns an object with the decoded value and the new offset.
52 */
53function decodeMessagePack(data, offset) {
54 if (offset >= data.length)
55 return { value: null, offset: offset };
56
57 var byte = data[offset];
58 offset++;
59
60 // Positive fixint (0x00 - 0x7f)
61 if (byte <= 0x7f)
62 return { value: byte, offset: offset };
63
64 // Fixmap (0x80 - 0x8f)
65 if (byte >= 0x80 && byte <= 0x8f) {
66 var size = byte & 0x0f;
67 var map = {};
68 for (var i = 0; i < size; i++) {
69 var keyResult = decodeMessagePack(data, offset);
70 offset = keyResult.offset;
71 var valueResult = decodeMessagePack(data, offset);
72 offset = valueResult.offset;
73 map[keyResult.value] = valueResult.value;
74 }
75 return { value: map, offset: offset };
76 }
77
78 // Fixarray (0x90 - 0x9f)
79 if (byte >= 0x90 && byte <= 0x9f) {
80 var size = byte & 0x0f;
81 var array = [];
82 for (var i = 0; i < size; i++) {
83 var result = decodeMessagePack(data, offset);
84 offset = result.offset;
85 array.push(result.value);
86 }
87 return { value: array, offset: offset };
88 }
89
90 // Fixstr (0xa0 - 0xbf)
91 if (byte >= 0xa0 && byte <= 0xbf) {
92 var length = byte & 0x1f;
93 var str = "";
94 for (var i = 0; i < length && offset < data.length; i++)
95 str += String.fromCharCode(data[offset++]);
96 return { value: str, offset: offset };
97 }
98
99 // Negative fixint (0xe0 - 0xff)
100 if (byte >= 0xe0)
101 return { value: byte - 256, offset: offset };
102
103 // Other types
104 switch (byte) {
105 case 0xc0:
106 return { value: null, offset: offset };
107
108 case 0xc2:
109 return { value: false, offset: offset };
110

Callers 1

parseFunction · 0.85

Calls 1

pushMethod · 0.80

Tested by

no test coverage detected