# Reglas de codificación básicas

Las Reglas de codificación básicas, o BER (Basic Encoding Rules), es uno de los formatos de codificación definidos como parte del estándar ASN.1.

## Descripción

Las Reglas de Codificación Básicas son las reglas definidas originalmente en el estándar ASN.1 para codificar información abstracta en un flujo de bits único, esto es, que pueda ser interpretado en cualquier máquina de la misma manera. Las reglas, denominadas sintaxis de transferencia en el contexto de ASN.1, especifican las secuencias de octetos exactas para codificar un elemento de datos dado. La sintaxis define elementos como: las representaciones para tipos de datos básicos, la estructura de la información, longitud, y los medios para definir tipos complejos o compuestos basados en más tipos primitivos. La sintaxis BER, junto con dos subconjuntos de BER (CER -Canonical Encoding Rules- y DER -Distinguished Encoding Rules-), están definidas por el documento de estándares X.690 de ITU-T, el cual es parte de las series de documentos ASN.1.
El formato BER especifica un formato auto-descriptivo y auto-delimitativo para codificar las estructuras de datos ASN.1. Cada elemento de datos está codificado por un identificador de tipos, una descripción longitud, los elementos de datos actuales, y donde sea necesario, un marcador de fin-de-contenido. Estos tipos de codificaciones son llamados comúnmente tipo-longitud-valor (TLV). Este formato permite a un receptor decodificar la información ASN.1 desde una corriente incompleta, sin necesitar conocimiento previo del tamaño, contenido, o significado semántico de los datos.

### Campo tipo

El identificador de tipos es un campo que especifica el tipo de dato que viene a continuación. Los dos primeros bits indican la clase de datos:
* Universal: 00
* Propio de la aplicación: 01
* Específico del contexto: 10
* Privado: 11
A continuación un bit indica si el dato es primitivo (0) o construido(1). Los cinco bits restantes indican un número de tag, que identifica al tipo de dato en sí. Si el número de tag vale 31 significa que el campo tipo ocupa más de un byte. Cada byte utilizado deberá tener el bit más significativo a 1, menos el último que empezará por 0. Por ejemplo, el tipo INTEGER es UNIVERSAL, primitivo (simple) y su número de tag es 2, luego se codifica: 00 0 00010.

### Campo longitud

Este campo indica cuántos bytes ocupa el valor. Si el primer bit vale cero, el campo longitud ocupa un byte. En caso de que el primer bit valga uno, los siete bits restantes indican la longitud (en bytes) del resto del campo longitud. Por ejemplo, la longitud de cuatro bytes (del campo valor) se codifica 0 0000100 y la longitud de mil bytes se codifica 1 0000010 00000011 11101000. Existe un valor especial de longitud (10000000) para representar una longitud indefinida. El campo valor acaba con un byte especial denominado "Fin de contenido" ("End Of Content" o EOC).

### Campo valor

En este campo se introduce el valor concreto del objeto que nos estamos refiriendo.

## Comparación con formatos alternativos

La diferencia clave entre el formato BER y los formatos CER o DER es la flexibilidad suministrada por las reglas de codificación Básicas. Como dice en el estándar X.690, "Las codificaciones alternativas se permiten por las reglas de codificación básicas como una opción del emisor. Los receptores quienes piden conformidad con las reglas de codificación básicas deben soportar todas las alternativas". Por ejemplo, cuando codificamos un valor construido (esto es, un valor que está compuesto de múltiples valores ya codificados más pequeños), el emisor puede usar una de las tres formas diferentes para especificar la longitud de los datos. Un receptor debe estar preparado para aceptar todas las codificaciones legales para cumplir la conformidad BER. En cambio, ambos CER y DER restringen las especificaciones de longitud disponibles a una opción.
Hay una percepción común de que BER está siendo ineficiente comparado con las reglas de codificación alternativas. Esto se ha respondido argumentando que es principalmente debido a pobres implementaciones, no es algo inherente a las reglas de codificación. Estas implementaciones confían en la flexibilidad que BER suministra para usar lógica de codificación que es más fácil de implementar, pero redunda en una corriente de datos mayor de lo necesario. Con independencia de que esta ineficiencia sea real o una mera percepción, esto ha llevado a diseñar varios esquemas de codificación alternativos, tales como Packed Encoding Rules, que intentan mejorar el rendimiento y tamaño de BER.
Se están desarrollando otras reglas de formateo alternativas, que dan la misma flexibilidad que BER pero usando esquemas de codificación alternativos. Las más populares son las basadas en XML, como las XML Encoding Rules y SOAP. Además, existe un mapeo estándar para convertir XML en ASN.1, que ya se puede codificar usando BER.

## Utilización

A pesar de sus problemas, BER es un formato popular para transmitir datos, particularmente en sistemas con codificaciones de datos nativas distintas.
* El protocolo SNMP específica ASN.1 con BER como su esquema de codificación requerido.
* El estándar de firma digital PKCS #7 también especifica ASN.1 con BER para codificar mensajes cifrados y su firma digital.
* Muchos sistemas de telecomunicaciones, tales como ISDN, y la mayoría de los servicios de teléfono celulares móvil usan ASN.1 con BER en algún grado para transmitir mensajes de control sobre la red.
* Los mensajes LDAP son codificados usando BER.

## si también

* SNMP