Estamos comprometidos a ofrecer soluciones de software rápidas, eficientes y asequibles que establecen nuevos estándares de la industria de desarrollo de aplicaciones.
  • Página de inicio de R-Studio
  • Documentación técnica de R-Studio

Ejemplo de patrón II


<?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>