2009-09-30 8 views
5

Le code documentation for the AMF format d'Adobe ne semble pas indiquer la structure d'un message AMF entier. Il spécifie uniquement le format des types de données individuels. J'ai lu la fichue chose cinq fois et soit je manque totalement ce que devrait contenir un message AMF, ou ce n'est pas là. Est-ce que quelqu'un sait de toute la documentation de la structure réelle du message entier?Structure de message AMF?

Répondre

9

La spécification pourrait être décrite comme "laconique".

Le codage AMF utilise des octets appelés "marqueurs de type". Le marqueur de type pour un nombre entier est la valeur 4. Les données d'entier suivent immédiatement cette balise et ont une longueur de 1 à 4 octets. La longueur varie parce que le type entier est "compressé" de sorte que les valeurs 0-127 nécessitent seulement 1 octet, alors que les valeurs plus grandes nécessitent plus d'octets. Ce format entier est appelé "U29" par la spécification.

À titre d'exemple, si nous devions simplement passer l'entier « 5 », un paquet AMF valide serait ces deux octets:
04 05

Dans les applications sur le web, les données AMF est parfois précédée d'une longueur codée comme un long non signé dans l'ordre des octets du réseau. Si vous observez une telle application, vous pouvez voir:
00 00 00 02 04 05, où 00 00 00 02 indique que les données AMF suivantes ont une longueur de 2 octets.

Maintenant, supposons que nous avons envoyé un objet après qu'il avait le constructeur suivant:

 
    this.ui = "button_press"; 
    this.param = 5; 

Ensuite, nous pourrions voir ce qui suit dans les données AMF:

0A - la balise object
2B - u29o-val: 2 membres scellés, objet avec traits et données, éventuellement membres dynamiques
01 - chaîne vide - objet anonyme
05 - chaîne par valeur, la longueur de chaîne: 2
75 69 - 'ui'
0B - chaîne par valeur, la longueur de chaîne: 5
70 61 72 61 6D - 'param'
19 - chaîne par valeur , la longueur de chaîne: 12
62 75 74 74 6F 6E 5F 70 72 65 73 73 - 'BUTTON_PRESS'
04 - entier
05 - valeur de nombre entier: 5
01 - nom vide, fin de liste vide dynamique me mbers cet objet

Étant donné que ce paquet prendra 28 octets, il peut être préfixé par: 00 00 00 1C lorsqu'il est rencontré dans la nature.

Une autre possibilité à considérer est que les communications AMF peuvent être compressées, typiquement en utilisant la compression "deflate" disponible dans zlib.

J'espère que cela vous aidera à trier les spécifications, mais si vous avez des questions, j'essaierai d'y répondre.

+0

Merci, très utile. J'espérais en fait que quelque part il y a une description BNF d'un message AMF valide complet, y compris les en-têtes et autres joyeusetés; Je suis allé à travers le code pour AMFPHP juste pour voir ce qu'il fait quand il décode, et il y avait beaucoup de choses là-dedans qui n'ont même pas été suggérées dans les spécifications, et encore moins décrites en détail. – dirtside

1

Si vous recherchez l'accès distant structure du message, il est ajouté à la fin de la AMF0 spec - Section 4