SDXF ( Structured Data eXchange Format ) es un formato de serialización de datos definido por RFC 3072. [1] Permite ensamblar datos estructurados arbitrarios de diferentes tipos en un archivo para intercambiarlos entre computadoras arbitrarias.
La capacidad de serializar datos de forma arbitraria en un formato autodescriptivo recuerda a XML , pero SDXF no es un formato de texto (como XML) — SDXF no es compatible con editores de texto. La longitud máxima de un dato (compuesto y elemental) codificado con SDXF es de 16777215 bytes (uno menos que 16 MB ).
Los datos SDXF pueden expresar niveles arbitrarios de profundidad estructural. Los elementos de datos se autodocumentan , lo que significa que los metadatos (numéricos, cadenas de caracteres o estructuras) están codificados en los elementos de datos. El diseño de este formato es simple y transparente: los programas informáticos acceden a los datos SDXF con la ayuda de funciones bien definidas, lo que exime a los programadores de tener que aprender el diseño preciso de los datos.
La palabra "intercambio" en el nombre refleja otro tipo de transparencia: las funciones SDXF proporcionan una conversión de datos independiente de la arquitectura del ordenador. Las serializaciones se pueden intercambiar entre ordenadores (a través de la red directa, transferencia de archivos o CD) sin necesidad de medidas adicionales. Las funciones SDXF del lado receptor se encargan de la adaptación de la arquitectura.
Los datos estructurados son datos con patrones predecibles más complejos que las cadenas de texto. [2]
Ejemplo comercial: dos empresas quieren intercambiar facturas digitales. Las facturas tienen la siguiente estructura jerárquica anidada:
FACTURA│├─ FACTURA_NO ├─ FECHA├─ DIRECCIÓN_REMITENTE│ ├─ NOMBRE│ ├─ NOMBRE│ ├─ CALLE│ ├─ CÓDIGO POSTAL│ ├─ CIUDAD│ └─ PAÍS├─ DIRECCIÓN_DESTINATARIO│ ├─ NOMBRE│ ├─ NOMBRE│ ├─ CALLE│ ├─ CÓDIGO POSTAL│ ├─ CIUDAD│ └─ PAÍS├─ SUMA_FACTURA├─ ARTÍCULOS_ÚNICOS│ ├─ ARTÍCULO ÚNICO│ │ ├─ CANTIDAD│ │ ├─ NÚMERO DE ARTÍCULO│ │ ├─ TEXTO DEL ELEMENTO│ │ ├─ CARGO│ │ └─ SUMA│ └─ ... ├─ CONDICIONES...
El elemento básico es un fragmento. Una serialización SDXF es en sí misma un fragmento. Un fragmento puede constar de un conjunto de fragmentos más pequeños. Los fragmentos se componen de un prefijo de encabezado de seis bytes, seguido de datos. El encabezado contiene un identificador de fragmento como un número binario de 2 bytes (Chunk_ID), la longitud y el tipo del fragmento. Puede contener información adicional sobre compresión, cifrado y más.
El tipo de fragmento indica si los datos consisten en texto (una cadena de caracteres), un número binario (entero o de punto flotante) o si el fragmento es una composición de otros fragmentos.
Los fragmentos estructurados permiten al programador empaquetar construcciones jerárquicas como la FACTURA anterior en una estructura SDXF de la siguiente manera: A cada término nombrado (FACTURA, NÚMERO_FACTURA, FECHA, DIRECCIÓN_REMITENTE, etc.) se le asigna un número único en el rango de 1 a 65535 (entero binario sin signo de 2 bytes sin signo). El fragmento superior/externo se construye con el ID FACTURA (es decir, con el ID de fragmento numérico asociado) como un fragmento estructurado en el nivel 1. Este fragmento FACTURA se llena con otros fragmentos en el nivel 2 y superiores: NÚMERO_FACTURA, FECHA, DIRECCIÓN_REMITENTE, DIRECCIÓN_RECEPTOR, SUMA_FACTURA, ÍTEMS_ÚNICOS, CONDICIONES. Algunos fragmentos de nivel 2 se estructuran a su vez para las dos direcciones y ÍTEMS_ÚNICOS.
Para una descripción precisa, consulte la página 2 del RFC o alternativamente aquí. [3]
SDXF permite al programador trabajar en estructuras SDXF con un conjunto de funciones compacto. Hay solo algunas de ellas:
Para leer fragmentos, se deben utilizar las siguientes funciones:
- Inicial
- Para inicializar la estructura de parámetros y vincularla al fragmento existente.
- ingresar
- Para entrar en un fragmento estructurado, el primer fragmento de esta estructura está listo para procesarse.
- dejar
- Para abandonar la estructura actual. Esta estructura ya está vigente.
- próximo
- Va al siguiente fragmento si existe (de lo contrario, abandona la estructura actual).
- extracto
- Transferir (y adaptar) datos del fragmento actual a una variable de programa.
- seleccionar
- Para buscar el siguiente fragmento con un ID de fragmento determinado y actualizarlo.
Para crear fragmentos, se deben utilizar las siguientes funciones:
- Inicial
- Para inicializar la estructura de parámetros y vincularla a un búfer de salida vacío para crear un nuevo fragmento.
- crear
- Crea un nuevo fragmento y añádelo a la estructura existente actual (si existe).
- añadir
- Añade un fragmento completo a una estructura SDXF.
- dejar
- Para abandonar la estructura actual. Esta estructura ya está vigente.
El siguiente pseudocódigo crea facturas:
init ( sdx , buffersize = 1000 ); // inicializa la estructura de parámetros SDXF sdx create ( sdx , ID = INVOICE , datatype = STRUCTURED ); // inicio de la estructura principal create ( sdx , ID = INVOICE_NO , datatype = NUMERIC , value = 123456 ); // crea un Chunk elemental create ( sdx , ID = DATE , datatype = CHAR , value = "2005-06-17" ); // una vez más create ( sdx , ID = ADDRESS_SENDER , datatype = STRUCTURED ); // Subestructura create ( sdx , ID = NAME , datatype = CHAR , value = "Peter Somebody" ); // elemento. Chunk dentro de esta subestructura ... create ( sdx , ID = COUNTRY , datatype = CHAR , value = "France" ); // el último dentro de esta subestructura sale ; // cerrando la subestructura DIRECCIÓN_REMITENTE ... sale ; // cerrando la subestructura FACTURA
[4]
El pseudocódigo para extraer la estructura FACTURA podría verse así:
init ( sdx , contenedor = puntero a una estructura SDXF ); // inicializa la estructura de parámetros SDXF sdx enter ( sdx ) ; // se une a la estructura INVOICE. // while ( sdx.rc == SDX_RC_ok ) { switch ( sdx.Chunk_ID ) { case INVOICE_NO : extract ( sdx ); invno = sdx.value ; // la función extract pone valores enteros en el campo de parámetro 'value' break; // case DATE: extract ( sdx ) ; strcpy ( invdate , sdx.data ) ; // sdx.data es un puntero a la cadena de caracteres extraída break ; // case ADDRESS_SENDER : enter ( sdx ) ; // usamos 'enter' porque ADDRESS es un Chunk estructurado do while ( sdx . rc == SDX_RC_ok ) // bucle interno ... break ; ... } }
SDXF no está diseñado para facilitar su lectura ni para ser modificado por editores de texto. Una estructura editable relacionada es SDEF (formato editable de datos estructurados). [5]