国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

常用AMF解析

2019-11-08 19:51:22
字體:
供稿:網(wǎng)友

AMF 格式是 Adobe 推出的一個二進制數(shù)據(jù)格式

AMF0 :http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/amf/pdf/amf0-file-format-specification.pdf

AMF3 :http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf

rtmp流里分析幀類型18為AMF0類型,15為AMF3類型。 rtmp流里常用的AMF0格式有: AMF_NUMBER 0x00 AMF_BOOLEAN 0x01 AMF_STRING 0x02 AMF_NULL 0x05 AMF_LONG_STRING 0x0C AMF_OBJECT 0x03 AMF_OBJECT_END 0x09

解析流程: 一個字節(jié)為類型 :后面字節(jié)為數(shù)據(jù)內(nèi)容 例子: 01 00 01 表示后面的值為bool , 00 為值 false

各個常用類型的解析

AMF_NUMBER :一個類型字節(jié) + 八個數(shù)據(jù)字節(jié)(大編碼)

00 41 1e 9a e4 00 00 00 00 00 表示 AMF_NUMBER 41 1e 9a e4 00 00 00 00 換算為 501433

AMF_BOOLEAN : 一個類型字節(jié) + 一個數(shù)字字節(jié)

01 01 01 表示 AMF_BOOLEAN 01 為 true

AMF_STRING :一個類型字節(jié) + 二個字節(jié)保存長度N (大編碼) + N個數(shù)據(jù)字節(jié)

02 00 04 6d 70 34 32 02 表示 AMF_STRING 00 04 表示字符串長度為4 6d 70 34 32 換算成 “mp42”

AMF_NULL : 一個類型字節(jié)

05 05 表示 AMF_NULL 后面沒有數(shù)據(jù)內(nèi)容

AMF_LONG_STRING :一個類型字節(jié) + 四個字節(jié)保存長度N(大編碼) + N個數(shù)據(jù)字節(jié)

類似 AMF_STRING ,只是長度由4個字節(jié)組裝

AMF_OBJECT : 一個類型字節(jié) + N個組合字節(jié)[AMF_STRING + 一個類型字節(jié) + 類型字節(jié)內(nèi)容] + 長度為0的AMF_STRING + AMF_OBJECT_END類型字節(jié) 參考wireshark抓包內(nèi)容

Name: level 為一個AMF_STRING類型,不帶一個字節(jié)類型標示 String `status` 為一個AMF_STRING類型,帶一個字節(jié)類型標示,也可以是帶一個字節(jié)類型標示的AMF_BOOLEAN或者AMF_NUMBER

代碼: yuAMF.h

typedef enum{ AMF_NUMBER = 0, AMF_BOOLEAN, AMF_STRING, AMF_OBJECT, AMF_MOVIECLip, /* reserved, not used */ AMF_NULL, AMF_UNDEFINED, AMF_REFERENCE, AMF_ECMA_ARRAY, AMF_OBJECT_END, AMF_STRICT_ARRAY, AMF_DATE, AMF_LONG_STRING, AMF_UNSUPPORTED, AMF_RECORDSET, /* reserved, not used */ AMF_xml_DOC, AMF_TYPED_OBJECT, AMF_AVMPLUS, /* switch to AMF3 */ AMF_INVALID = 0xff} AMFDataType;typedef struct AVal{ char *av_val; int av_len;} AVal;class uyAMF {public: uyAMF(char* data , int len); ~uyAMF(); bool checkout(); AMFDataType AMF_GetType(); unsigned short AMF_DecodeInt16(); unsigned int AMF_DecodeInt24(); unsigned int AMF_DecodeInt32(); void AMF_DecodeString( AVal& bv); void AMF_DecodeLongString( AVal& bv); int AMF_DecodeBoolean(); double AMF_DecodeNumber(); void AMF_DecodeObject(std::map<std::string,std::string>& paramMap);public: char* amf_data; int amf_len; int decode_amf_len;};

uyAMF.cpp

uyAMF::uyAMF(char *data, int len):amf_data(data),amf_len(len),decode_amf_len(0){}uyAMF::~uyAMF(){}AMFDataType uyAMF::AMF_GetType(){ decode_amf_len ++ ; return (AMFDataType)*amf_data++;}unsigned short uyAMF::AMF_DecodeInt16(){ if (decode_amf_len + 2 > amf_len) { return 0; } unsigned char *c = (unsigned char *) amf_data; unsigned short val; val = (c[0] << 8) | c[1]; amf_data += 2; decode_amf_len += 2; return val;}unsigned int uyAMF::AMF_DecodeInt24(){ if (decode_amf_len + 3 > amf_len) { return 0; } unsigned char *c = (unsigned char *) amf_data; unsigned int val; val = (c[0] << 16) | (c[1] << 8) | c[2]; amf_data += 3; decode_amf_len += 3; return val;}unsigned int uyAMF::AMF_DecodeInt32(){ if (decode_amf_len + 4 > amf_len) { return 0; } unsigned char *c = (unsigned char *)amf_data; unsigned int val; val = (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3]; amf_data += 4; decode_amf_len += 4; return val;}void uyAMF::AMF_DecodeString(AVal& bv){ if (decode_amf_len + 1 > amf_len) { bv.av_len = 0; bv.av_val = NULL; return; } bv.av_len = AMF_DecodeInt16(); if (decode_amf_len + bv.av_len > amf_len) { bv.av_len = 0; bv.av_val = NULL; return; } bv.av_val = (bv.av_len > 0) ? (char *)amf_data : NULL; amf_data += bv.av_len ; decode_amf_len += bv.av_len;}void uyAMF::AMF_DecodeLongString(AVal &bv){ if (decode_amf_len + 1 > amf_len) { bv.av_len = 0; bv.av_val = NULL; return; } bv.av_len = AMF_DecodeInt32(); if (decode_amf_len + bv.av_len > amf_len) { bv.av_len = 0; bv.av_val = NULL; return; } bv.av_val = (bv.av_len > 0) ? (char *)amf_data : NULL; amf_data += bv.av_len ; decode_amf_len += bv.av_len;}int uyAMF::AMF_DecodeBoolean(){ bool succ = *amf_data != 0; amf_data += 1; decode_amf_len += 1; return succ;}double uyAMF::AMF_DecodeNumber(){ if (decode_amf_len + 8 > amf_len) { return 8; } double dVal;#if __FLOAT_Word_ORDER == __BYTE_ORDER#if __BYTE_ORDER == __BIG_ENDIAN memcpy(&dVal, amf_data, 8);#elif __BYTE_ORDER == __LITTLE_ENDIAN unsigned char *ci, *co; ci = (unsigned char *)amf_data; co = (unsigned char *)&dVal; co[0] = ci[7]; co[1] = ci[6]; co[2] = ci[5]; co[3] = ci[4]; co[4] = ci[3]; co[5] = ci[2]; co[6] = ci[1]; co[7] = ci[0];#endif#else #if __BYTE_ORDER == __LITTLE_ENDIAN /* __FLOAT_WORD_ORER == __BIG_ENDIAN */ unsigned char *ci, *co; ci = (unsigned char *)amf_data; co = (unsigned char *)&dVal; co[0] = ci[3]; co[1] = ci[2]; co[2] = ci[1]; co[3] = ci[0]; co[4] = ci[7]; co[5] = ci[6]; co[6] = ci[5]; co[7] = ci[4];#else /* __BYTE_ORDER == __BIG_ENDIAN && __FLOAT_WORD_ORER == __LITTLE_ENDIAN */ unsigned char *ci, *co; ci = (unsigned char *)amf_data; co = (unsigned char *)&dVal; co[0] = ci[4]; co[1] = ci[5]; co[2] = ci[6]; co[3] = ci[7]; co[4] = ci[0]; co[5] = ci[1]; co[6] = ci[2]; co[7] = ci[3];#endif#endif decode_amf_len += 8; amf_data += 8; return dVal;}bool uyAMF::checkout(){ return (decode_amf_len + 1 <= amf_len);}void uyAMF::AMF_DecodeObject(std::map<std::string, std::string>& paramMap){ AVal tmp; std::string val; std::string key; bool succ = true; while (succ) { key.clear(); val.clear(); AMF_DecodeString(tmp);
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广西| 米脂县| 德惠市| 炎陵县| 东兰县| 海盐县| 静海县| 阿城市| 洪洞县| 长汀县| 江西省| 社会| 本溪| 延川县| 兴海县| 青龙| 洛浦县| 湟源县| 昭平县| 东海县| 礼泉县| 陆河县| 玉山县| 抚宁县| 赫章县| 五大连池市| 克山县| 庆元县| 越西县| 五台县| 南溪县| 兰州市| 陈巴尔虎旗| 射阳县| 阿巴嘎旗| 安远县| 灵璧县| 扎兰屯市| 府谷县| 阳谷县| 吉木萨尔县|