2009-09-30 14 views
5

El documentation for the AMF format de Adobe no parece realmente especificar la estructura de un mensaje AMF completo. Solo especifica el formato de los tipos de datos individuales. He leído la maldita cosa cinco veces y o bien me falta totalmente lo que debería contener un mensaje AMF real, o no está allí. ¿Alguien sabe de alguna documentación de la estructura real del mensaje completo?estructura de mensajes AMF?

Respuesta

9

La especificación podría describirse como "concisa".

La codificación AMF utiliza bytes que se denominan "marcadores de tipo". El marcador de tipo para un entero es el valor 4. Los datos enteros siguen inmediatamente a esta etiqueta, y tienen 1-4 bytes de longitud. La longitud varía porque el tipo entero está "comprimido", de modo que los valores 0-127 requieren solo 1 byte, mientras que los valores más grandes requieren más bytes. Este formato entero se llama "U29" por la especificación.

Como un ejemplo, si tuviéramos que pasar simplemente el número entero "5", un paquete de AMF válida sería estos dos bytes:
04 05

En aplicaciones que se encuentran en la web, los datos AMF es a veces precedida por una longitud codificada como un largo sin signo en orden de bytes de red. Si estaba observando una aplicación de este tipo, puede ver:
00 00 00 02 04 05, donde 00 00 00 02 indica que los siguientes datos AMF tienen 2 bytes de longitud.

Ahora, supongamos que envíen un objeto después de que tenía el siguiente constructor:

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

entonces podemos ver lo siguiente en los datos AMF:

0A - etiqueta del objeto
2B - u29o-val: 2 miembros sellados, objeto con rasgos y datos, posiblemente miembros dinámicos
01 - cadena vacía - objeto anónimo
05 - cadena-por-valor, longitud de la cadena: 2
75 69 - 'ui'
0B - cadena-por-valor, longitud de la cadena: 5
70 61 72 61 6D - 'PARAM'
19 - cadena por valor , longitud de la cadena: 12
62 75 74 74 6F 6E 5F 70 72 65 73 73 - 'BUTTON_PRESS'
04 - número entero
05 - valor de número entero: 5
01 - nombre vacío, termina lista vacía de mí dinámico mbers este objeto

Dado que el paquete tendrá 28 bytes, puede que tenga el prefijo: 00 00 00 1C cuando se encuentre en la naturaleza.

Otra posibilidad a tener en cuenta es que las comunicaciones AMF pueden comprimirse, normalmente utilizando la compresión "desinflar" disponible en zlib.

Espero que esto te ayude a resolver la especificación, pero si tienes preguntas, intentaría responderlas.

+0

Gracias, muy útil. Realmente estaba esperando que en alguna parte haya una descripción BNF de un mensaje AMF válido completo, incluidos encabezados y demás; Pasé por el código para AMFPHP solo para ver qué hace cuando se está decodificando, y había muchas cosas allí que ni siquiera se insinuaban en la especificación real, y mucho menos que se describían en detalle. – dirtside

1

Si usted está buscando para la comunicación remota estructura del mensaje que se añade al final de la AMF0 spec - Sección 4