Ejemplo de patrón I

Top  Previous  Next

A continuación puede ver un ejemplo de patrón con comentarios de análisis de un archivo AVI.

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

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

<template name="AVI File">

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

  <signature align="1">

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

      <field offset="0x00">52 49 46 46</field> <!-- ANSI: RIFF -->

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

      <field offset="0x08">41 56 49 20</field> <!-- ANSI: LIST -->

  </signature>

 

   <!-- Sección de datos. Su nombre es AVI File. É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">

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

      <field type="char" size="4" name="Firma: RIFF" var="signature"/>

       <!-- La posición actual se ha desplazado al comienzo del archivo. -->

      <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" base="hex" name="Firma RIFF como entero sin signo en formato hexadecimal" var="signature"/>

 

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

      <if test="signature == 0x46464952"> <!-- ANSI: RIFF -->

           <!-- Los próximos 4 bytes se leen y se muestran como un entero sin signo. La variable interna dataSize (tamaño de datos) obtiene el valor del campo. -->

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

           <!-- Se ha creado una nueva variable interna endOfFile (final de archivo) y el campo expr está evaluando su valor.-->

          <setvar var="endOfFile" expr="offset + dataSize - 8"/>

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

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

 

           <!-- Se ha creado una nueva sección llamada DATOS -->

          <section name="DATOS">

               <!-- Se ha creado una nueva variable interna chunksOffset (desplazamiento de fragmentos) y el campo expr está evaluando su valor. Esta variable obtiene el valor absoluto del desplazamiento de plantilla. -->

              <setvar var="chunksOffset" expr="start_position"/>

 

               <!-- Se ha creado un bucle. Su condición está establecida en el campo de prueba (mientras la variable endOfFile sea mayor que la posición actual.) -->

              <repeat test="endOfFile > offset">

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

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

                   <!-- La posición actual se ha desplazado 4 bytes hacia atrás. -->

                  <goto offset="-4"/>

                   <!-- Los mismos 4 bytes se leen y se muestran como un entero sin signo. La variable interna signature obtiene este valor. -->

                  <field type="uint32" name="Firma como un entero sin signo" var="signature"/>

 

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

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

                       <!-- La sección está mostrada. Su nombre es LIST -->

                      <section name="LIST">

                           <!-- La posición actual se ha desplazado 4 bytes hacia atrás. -->

                          <goto offset="-4"/>

                           <!-- Los 4 bytes se leen y se muestran como un entero hexadecimal sin signo. Este campo tiene los atributos offset y assigned-template. Si el usuario hace doble clic en este campo, se invocará el patrón AVI File LIST y la posición del patrón actual se desplazará a la dirección especificada en as-offset.-->

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

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

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

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

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

                           <!-- La posición actual se ha desplazado 4 bytes hacia atrás. -->

                          <goto offset="-4"/>

                           <!-- Los mismos 4 bytes se leen y se muestran como un entero hexadecimal sin signo. La variable listType (tipo de lista) obtiene su valor.-->

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

 

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

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

                               <!-- La variable chunksOffset (desplazamiento de fragmentos) obtiene su valor evaluado en el atributo expr. -->

                              <setvar var="chunksOffset" expr="start_position + offset - 4"/>

                          </if>

 

                           <!-- La posición actual se ha desplazado a la dirección evaluada en el atributo de la dirección. -->

                          <goto address="offset + listSize - 4"/>

                      </section>

                  </if>

 

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

                  <if test="signature == 1263424842"> <!-- ANSI: JUNK -->

                       <!--  La sección de muestra con el nombre JUNK (elementos no deseados). -->

                      <section name="JUNK">

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

                          <field type="uint32" name="Tamaño de los datos de los elementos no deseados" var="junkSize"/>

                           <!-- La posición actual se ha desplazado hacia atrás la cantidad de bytes especificada en junkSize.  -->

                          <goto offset="junkSize"/>

                      </section>

                 </if>

 

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

                  <if test="signature == 829973609"> <!-- ANSI: idx1 -->

                       <!--  Esta sección se muestra con el nombre idx1. -->

                      <section name="idx1">

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

                          <field type="uint32" name="Tamaño de los datos de idx1" var="idxSize"/>

                           <!-- La sección se muestra con el nombre First AVIINDEXENTRY (primera entrada de índice de AVI). -->

                          <section name="First AVIINDEXENTRY">

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

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

                               <!-- Los próximos 4 bytes se leen y se muestran como un entero hexadecimal sin signo. -->

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

                               <!-- Los próximos 4 bytes se leen y se muestran como un entero hexadecimal sin signo. El atributo de desplazamiento se evalúa para este campo como suma de la variable chunksOffset y el valor de este campo.  -->

                              <field type="uint32" base="hex" name="Desplazamiento de fragmento" as-offset="chunksOffset + this"/>

                               <!-- Los próximos 4 bytes se leen y se muestran como un entero sin signo. -->

                              <field type="uint32" name="Tamaño de fragmento"/>

                          </section>

                           <!-- La posición actual se ha desplazado hacia delante la cantidad de bytes especificada en idxSize. -->

                          <goto offset="idxSize"/>

                      </section>

                  </if>

 

                   <!-- Prueba de condición. &amp;&amp; es un AND lógico (&&) -->

                  <if test="signature != 1414744396 &amp;&amp; signature != 1263424842 &amp;&amp; signature != 829973609">

                       <!-- Se ha mostrado un sección vacía. Su nombre es Se ha encontrado una firma desconocida -->

                      <section name="Se ha encontrado una firma desconocida">

                      </section>

                       <!-- La posición actual se ha desplazado hacia la dirección establecida en la variable endOfFile. -->

                      <goto address="endOfFile"/>

                 </if>

              </repeat>

          </section>

      </if>

  </section>

</template>