Пакет, который вы получили, представляет собой префикс AMF3 AmfObject.
В общем, всякий раз, когда вы видите строку, которая следует за обычное именование полных имен классов (т.е. как обратные домены), скорее всего, вы имеете дело с object
например .
Рассматривая первые несколько байтов, вы видите 0x00
три раза. Если мы предположим, что AMF3, это будет 3 undefined
s, за которым следует объект с маркером типа 0x3e
- которого не существует. Если мы предположим, что AMF0, у нас сначала будет число (0x00
маркер типа, за которым следует 8 байтов данных), за которым следует объект с маркером типа 0x6d
- который снова не существует.
Таким образом, данные, которые вы получили, не могут быть полезны только для AMF. Однако, если мы интерпретируем первые 4 байта как порядковый номер сети (т. Е. Большой конец), получим 0x3E = 62
- это точно длина оставшихся данных.
Предполагая, что первые 4 байта являются префикс длины, следующий байт должен быть маркером типа. В AMF3 0x0a
указывает экземпляр object
. Поэтому давайте просто попробуем декодировать оставшиеся данные (раздел 3.12 из AMF3 spec, если вы хотите следовать вдоль): следующий байт должен указывать признаки объекта. 0x23
означает, что мы имеем прямое кодирование признаков этого байта - в отличие от ссылки на ранее представленные объекты.
Поскольку четвертый бит (считающийся с наименьшим значащим первым) равен 0, объект не является динамическим - как в примере экземпляра некоторого класса, а не просто экземпляром простого объекта. Остальные биты, сдвинутые вправо на 4, указывают количество запечатанных свойств этого экземпляра, которое равно 2.
Далее мы ожидаем имя класса, закодированное как UTF-8-vr
- т.е. длина префикса (при сдвиге справа на 1) , Кодированная строка UTF-8. Следующий байт равен 0x1d
, что означает, что длина равна 0x1d >> 1 = 14
. Следующие 14 байтов кодируют common.net.APC
, так что это имя класса экземпляра.
Впоследствии у нас есть два запечатанных названия свойств, также закодированные как UTF-8-vr
. Первый имеет префикс 0x15
, поэтому длина 10 - дает нам parameters
, а затем префикс 0x19
(длина 12) и полезную нагрузку functionName
.
После этого у вас есть значения, соответствующие этим герметичным свойствам, в том же порядке. Первый имеет маркер типа 0x09
, который соответствует массиву. Маркер длины - 0x03
, что означает, что массив содержит один элемент, а следующий байт - 0x01
, что указывает на отсутствие ассоциативных элементов. Единственный элемент имеет маркер типа 0x04
, то есть это integer
- в этом случае со значением 0.
За этим следует маркер типа 0x06
- строка с длиной 14. Эта строка - вы, наверное, догадались об этом до сих пор - это syncServerTime
.
Так, в целом, ваш пакет длина префикса экземпляр common.net.APC
, с его parameters
атрибут установлен в [0]
, а атрибут functionName
установлен "syncServerTime"
.
1: Единственные другие альтернативы вектор экземпляров объекта - что потребовало бы типа маркера 0x10
где-то - или пакет AMF0. В случае пакета AMF0 вы также должны иметь путь в стиле URI где-то в пакете, что здесь не так.
2: Обратите внимание, что EBNF приведены в конце раздела не совсем правильно - ни синтаксически, ни семантически ...
Спасибо, решить мою проблему – ExtremsX