Created
October 17, 2018 17:31
-
-
Save ssddi456/5f1f5ce13e04ebea2badd6874bf8219e to your computer and use it in GitHub Desktop.
try decode amf according wikipedia's doc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var data = new Buffer([0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x42, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, // 16 | |
0x69, 0x63, 0x65, 0x2e, 0x64, 0x6f, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x54, 0x6f, // 32 | |
0x42, 0x61, 0x74, 0x63, 0x68, 0x00, 0x02, 0x2f, 0x31, 0x00, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, // 47 | |
0x00, 0x00 | |
]); | |
var offset = 0; | |
var version = data.readUInt16BE(offset); | |
offset += 2; | |
var headerLen = data.readUInt16BE(offset); | |
offset += 2; | |
function readUtf(data) { | |
var len = data.readUInt16BE(offset); | |
offset += 2; | |
var str = data.slice(offset, offset + len); | |
offset += len; | |
return str.toString(); | |
} | |
function readLongUtf(data) { | |
var len = data.readInt32BE(offset); | |
offset += 4; | |
var str = data.slice(offset, offset + len); | |
offset += len; | |
return str.toString(); | |
} | |
function readAmf0Object(data) { | |
var obj = {}; | |
do { | |
var name = readUtf(data); | |
console.log( JSON.stringify(name), name.length ); | |
if(name.length == 0){ | |
var endObj = data.readUInt8(offset) == 0x09; | |
if(endObj) { | |
return obj | |
} | |
} | |
var value = readAmf0Data(data); | |
obj[name] = value; | |
} while (true); | |
} | |
function readAmf3Data(data) { | |
} | |
function readAmf0Data(data) { | |
var type = data.readUInt8(offset); | |
offset += 1; | |
switch (type) { | |
case 0x00: | |
var ret = data.readDoubleBE(offset); | |
offset += 8; | |
return ret; | |
case 0x01: | |
var ret = data.readUInt8(offset); | |
offset += 1; | |
return ret == 1; | |
case 0x02: | |
return readUtf(data); | |
case 0x03: | |
return readAmf0Object(data); | |
case 0x05: | |
return null; | |
case 0x08: | |
return readAmf0Array(data); | |
case 0x0a: | |
return readAmf0Array(data); | |
case 0x0b: | |
var timeStamp = data.readDoubleBE(offset); | |
offset += 8; | |
var timeZone = data.readUInt16BE(offset); | |
offset += 2; | |
return [timeStamp, timeZone]; | |
case 0x0c: | |
return readLongUtf(data); | |
case 0x0f: | |
return readLongUtf(data); | |
case 0x10: | |
var name = readUtf(data); | |
var body = readAmf0Data(data); | |
return { | |
name: name, | |
body: body | |
}; | |
case 0x11: | |
return readAmf3Data(data); | |
} | |
} | |
function readAmf0Array(data) { | |
console.log(data.length, offset); | |
var amf0ArrayLen = data.readInt32BE(offset); | |
offset += 4; | |
var ret = []; | |
for (var i = 0; i < amf0ArrayLen; i++) { | |
ret.push(readAmf0Data()); | |
} | |
return ret; | |
} | |
for (var i = 0; i < headerLen; i++) { | |
var header = readUtf(data); | |
var required = data.readInt8(offset); | |
offset += 1; | |
var headerValueLen = data.readUInt16BE(offset); | |
offset += 2; | |
var headerValue = data.slice(offset, offset + headerValueLen) | |
offset += headerValueLen; | |
} | |
var bodyLen = data.readUInt16BE(offset); | |
offset += 2; | |
for (var j = 0; j < bodyLen; j++) { | |
var reqUrl = readUtf(data); | |
var respUrl = readUtf(data); | |
console.log(reqUrl, respUrl, offset); | |
// this seems truely useless | |
var messageBodyLen = data.readInt32BE(offset); | |
offset += 4; | |
console.log(messageBodyLen, offset); | |
var body = readAmf0Data(data); | |
console.log(body); | |
} | |
var obj = new Buffer([0x03, 0x00, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x02, 0x00, 0x04, 0x4d, 0x69, 0x6b, 0x65, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x02, 0x00, 0x04, 0x4d, 0x69, 0x6b, 0x65, 0x00, 0x00, 0x09]); | |
offset = 0; | |
console.log(readAmf0Data(obj)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment