Я пытаюсь сделать AMF-пакет. Я использую https://github.com/Ventero/amf-cpp C++-реализацию AMF3, но он не содержит всех необходимых переменных. AMF0 документации, описывающая, как строятся АИФ пакета (http://download.macromedia.com/pub/labs/amf/amf0_spec_121207.pdf) Первых два байта определяет версию пакета:Пытается сделать пакет AMF3
версии = U16 Это может быть 0 или 3
U16 является беззнаковым 16-разрядным целое число в большой Endian порядке (сеть) байт
Так я создал
typedef unsigned int u16;
В amf.hpp Я пытаюсь теперь добавить всю информацию заголовка в одиночную std :: векторную переменную. я писал:
std::vector<u16> buf = std::vector<u16>{3}; //packet version
std::vector<u16> buf2 = std::vector<u16>{0}; //header-count
std::vector<u16> buf3 = std::vector<u16>{1}; //message count
std::vector<u16> data;
buffermain.insert(data.end(), buf.begin(), buf.end());
buffermain.insert(data.end(), buf2.begin(), buf2.end());
buffermain.insert(data.end(), buf3.begin(), buf3.end());
В результате в данном я только что первый вставленный векторе (БУФЫ).
// edit Я достиг некоторого прогресса.
Serializer serializer;
QByteArray outArray; //to insert amf bytes, and send it later
AmfArray Content;
AmfObject Object;
Object.addSealedProperty("Source", AmfNull());
Object.addSealedProperty("operation", AmfNull());
Object.addSealedProperty("clientId", AmfNull());
Object.addSealedProperty("destination", AmfNull());
Object.addSealedProperty("messageId", AmfNull());
Object.addSealedProperty("timestamp", AmfNull());
Object.addSealedProperty("timeToLive", AmfNull());
Object.addSealedProperty("timeToLive", AmfNull());
Object.addSealedProperty("body", AmfNull());
Object.addSealedProperty("headers", AmfNull());
Content.push_back(Object);
serializer << Content;
std::vector<uint8_t> data2 = serializer.data();
char* datas = reinterpret_cast<char*>(data2.data());//
std::vector<unsigned __int32> v;
v.reserve(data.size());
char* sizes = reinterpret_cast<char*>(v.data()); //teoretical size of message in U32
char null = 0;
outArray.append(null); //version first byte
outArray.append(3); //version second byte
outArray.append(null); //header count first byte
outArray.append(null); //header count second byte
outArray.append(null); //messages count first byte
outArray.append(1); //messages count second byte
outArray.append(null); //"Target" lenght first byte
outArray.append(4); //"Target" lenght second byte
outArray.append(QByteArray::fromHex("6e756c6c")); // "Target" value
outArray.append(null); // "Response" length first byte
outArray.append(2); // "Response" length second byte
outArray.append(QByteArray::fromHex("2f31"));
outArray.append(sizes); //insert theoretical length of message
outArray.append(datas); //insert message
У вас остались вопросы? Я думаю, вы хорошо объяснили, что вы пытаетесь сделать; но я не понимаю, в чем проблема. – JeffryHouser
Хорошо AMF (0 или 3) обычно является просто кодировкой данных. Особенно каждое сообщение AMF3 обернуто в сообщение AMF0, которое содержит контент AMF3 в специально выделенной части сообщения AMF0. В полезной нагрузке AMF3 обычно Adobe напрямую не кодирует вашу полезную нагрузку. Обычно он заключен в сериализованные командные объекты AMF3. Однажды я сделал полную обратную разработку связи AMF3. К сожалению, я в настоящее время не могу найти этот документ ... даст ему еще один вид, когда я буду дома. –
@ Reboog711 Я описал код, я просто не знаю, почему buffermain содержит только первое вставленное значение (buf), оно должно содержать buf, buf2 и buf3. –