Ejemplo de patrón II

Top  Previous  Next

<?xml version="1.0" encoding="utf-8"?>

<!-- Sección de patrón. El nombre del patrón es AVI File LIST (lista de archivos AVI) -->

<template name="AVI File LIST">

   <!-- Sección de firma de plantilla. Alineación es 1. -->

  <signature align="1">

       <!-- Firma de 4 bytes en desplazamiento 0x00. -->

      <field offset="0x00">4C 49 53 54</field> <!-- ANSI: LIST -->

  </signature>

 

   <!-- Sección de datos. Su nombre es AVI File LIST. Ésta es una sección de datos principal. En el árbol de análisis no se muestra como una sección (su nombre está omitido).-->

   <section name="AVI File LIST">

       <!-- Los primeros 4 bytes se leen y se muestran como una cadena ANSI. -->

      <field type="char" size="4" name="Firma: LIST"/>

       <!-- La posición actual se ha desplazado al comienzo del archivo (4 bytes hacia atrás). -->

      <goto offset="-4"/>

       <!-- Los primeros 4 bytes del archivo se leen y se muestran como un entero sin signo. La variable interna signature (firma) obtiene el valor del campo. -->

      <field type="uint32" name="Firma LIST (lista) como entero sin signo" var="signature"/>

 

       <!-- Prueba de condición (signature == LIST) -->

      <if test="signature == 1414744396"> <!-- ANSI: LIST -->

           <!-- Los próximos 4 bytes se leen y se muestran como un entero sin signo. La variable interna listSize (tamaño de lista) obtiene su valor. -->

          <field type="uint32" name="Tamaño de datos en la lista" var="listSize"/>

          <setvar var="endOfList" expr="offset + listSize"/>

 

          <field type="char" size="4" name="Tipo de lista"/>

          <goto offset="-4"/>

          <field type="uint32" base="hex" name="Tipo de lista como entero sin signo en formato hexadecimal" var="listType"/>

 

           <!-- Prueba de condición (listType == movi) -->

          <if test="listType == 0x69766f6d"> <!-- ANSI: movi -->

               <!-- Este fragmento no se va a analizar. La posición actual se ha desplazado al final del fragmento. -->

              <goto address="endOfList"/>

          </if>

 

          <setvar var="mediaType" expr="0"/>

          <repeat test="endOfList > offset - 8">

              <section name="FRAGMENTO">

                  <field type="char" size="4" name="ID de fragmento"/>

                  <goto offset="-4"/>

                  <field type="uint32" name="ID del fragmento como entero sin signo" var="chunkId"/>

                  <if test="chunkId == 1414744396"> <!-- ANSI: LIST -->

                      <goto offset="-4"/>

      <field type="uint32" base="hex" name="ID del fragmento de LIST como entero sin signo en formato hexadecimal" as-offset="start_position + offset - 4" assigned-template="AVI File LIST"/>

                  </if>

 

                  <field type="uint32" name="Tamaño de los datos en el fragmento" var="chunkSize"/>

                  <setvar var="endOfChunk" expr="offset + chunkSize"/>

 

                   <!-- Redondeo del valor de la variable endOfChunk (final de fragmento) a un número divisible entre 2. -->

                  <if test="endOfChunk &amp; 1">

                      <setvar var="endOfChunk" expr="endOfChunk &amp; 0xFFFFFFFE"/>

                      <setvar var="endOfChunk" expr="endOfChunk + 2"/>

                  </if>                  

 

                  <if test="chunkId == 1751742049"> <!-- ANSI: avih -->

                      <field type="uint32" name="Número de microsegundos entre fotogramas"/>

                      <field type="uint32" name="Velocidad máxima aproximada de transmisión de datos del archivo"/>

                      <field type="uint32" name="Alineación de datos, en bytes"/>

                      <field type="uint32" name="Combinación de las marcas bit a bit de cero o más"/>

                      <field type="uint32" name="Número total de fotogramas de datos en el archivo"/>

                      <field type="uint32" name="Fotograma inicial para archivos AVI"/>

                      <field type="uint32" name="Número de secuencias en el archivo"/>

                      <field type="uint32" name="Tamaño de búfer sugerido para la lectura del archivo"/>

                      <field type="uint32" name="El ancho del archivo AVI en píxeles"/>

                      <field type="uint32" name="El alto del archivo AVI en píxeles"/>

                      <field type="binary" size="16" name="Reservado"/>

                  </if>

 

                  <if test="chunkId == 1852994675"> <!-- ANSI: strn -->

                      <field type="char" size="chunkSize" name="Nombre de secuencia"/>

                  </if>

 

                  <if test="chunkId == 1752331379"> <!-- ANSI: strh -->

                      <field type="char" size="4" name="Tipo"/>

                      <goto offset="-4"/>

                      <field type="uint32" base="hex" name="Tipo como entero sin signo en formato hexadecimal" var="type"/>

                      <setvar var="mediaType" expr="type"/>

                      <field type="char" size="4" name="Controlador (codec)"/>

                      <field type="uint32" base="hex" name="Marcas"/>

                      <field type="uint32" name="Número del primer bloque de secuencia presente en el archivo"/>

                      <field type="uint32" name="Escala"/>

                      <field type="uint32" name="Velocidad de transferencia"/>

                      <field type="uint32" name="Hora de inicio de la secuencia"/>

                      <field type="uint32" name="Tamaño de la secuencia en unidades según está definido en Velocidad de transferencia y Escala"/>

                      <field type="uint32" name="Tamaño del búfer necesario para almacenar bloques de esa secuencia"/>

                      <field type="uint32" name="Calidad"/>

                      <field type="uint32" name="Tamaño de muestra (número de bytes de un átomo de secuencia)"/>

                  </if>

 

                  <if test="chunkId == 1718776947"> <!-- ANSI: strf -->

                      <if test="mediaType == 0x73646976"> <!-- ANSI: vids -->

                          <section name="BITMAPINFOHEADER">

                              <field type="uint32" name="Número de bytes que requiere la estructura"/>

                              <field type="int32" name="El ancho del mapa de bits en píxeles"/>

                              <field type="int32" name="El alto del mapa de bits en píxeles"/>

                              <field type="uint16" name="Número de planos para el dispositivo de destino"/>

                              <field type="uint16" name="Número de bits por píxel"/>

                              <field type="uint32" name="Tipo de compresión para un mapa de bits comprimido en formato ascendente"/>

                              <field type="uint32" name="Tamaño de la imagen en bytes"/>

                              <field type="int32" name="Resolución horizontal del dispositivo de destino para el mapa de bits en píxeles por metro"/>

                              <field type="int32" name="Resolución vertical del dispositivo de destino para el mapa de bits en píxeles por metro"/>

                              <field type="uint32" name="Número de índices de color en la tabla de colores utilizados en el mapa de bits"/>

                              <field type="uint32" name="Número de índices de color requeridos para visualizar el mapa de bits"/>

                          </section>

                      </if>

                     

                      <if test="mediaType == 0x73647561"> <!-- ANSI: auds -->

                          <section name="WAVEFORMATEX">

                              <field type="uint16" name="Formato WAV"/>

                              <field type="uint16" name="Número de canales en los datos WAV"/>

                              <field type="uint32" name="Velocidad de transferencia de muestra en muestras por segundo (Hz)"/>

                              <field type="uint32" name="Velocidad media de transmisión de datos requerida en bytes por segundo para la etiqueta de formato"/>

                              <field type="uint16" name="Alineación de bloques en bytes"/>

                              <field type="uint16" name="Bits por muestra para el formato WAV"/>

                              <field type="uint16" name="Tamaño en bytes de la información adicional sobre formato anexada al final de la estructura de WAVEFORMATEX"/>

                          </section>

                      </if>

                  </if>

 

                  <goto address="endOfChunk"/>

              </section>

          </repeat>

 

      </if>

 

      <if test="signature != 1414744396">

          <section name="Se ha encontrado una firma LIST no válida">

          </section>

      </if>

 

  </section>

</template>