3. Basic Encoding Rules


As "Basic Encoding Rules" provêem um algoritmo que especifica como um valor de qualquer estrutura (tipo) definida usando ASN.1 deve ser codificada para transmissão. O uso do algoritmo no sentido contrário permite que qualquer receptor que tinha conhecimento da definição do tipo ASN.1, possa decodificar os bits que chegam em um valor daquele tipo.

A codificação de um tipo de dados ASN.1 (usando as Basic Encoding Rules) permite que um receptor, sem conhecimento da definição de tipo, reconheça o inicio e o fim das construções (SEQUENCE, SET, etc) e os octetos representando os tipos básicos de dados (BOOLEAN, INTEGER). No uso mais simples da notação, e também possível determinar, a partir da codificação, as construções efetivamente usadas e os tipos de dados básicos.)

Quando o rótulo ASN.1 ("[]") e empregado, a codificação porta tanto o valor do rótulo como o valor identificando a construção do tipo de dado básico que foi rotulado.

Também e possível, na notação ASN.1, usar o que e chamado rotulação IMPLÍCITA a qual indica que, nas situações em que e usada, a rotulação não e necessária durante a transferência dos dados, pois pode ser percebida

pelo contexto e assim, e minimizada a quantidade de octetos transferida. A alternativa IMPLICIT não deve ser usada com os tipos CHOICE, ANY ou EXTERNAL. Exemplo:

  ExemploTipo ::= CHOICE
     { primeiraEscolha [0] IMPLICIT INTEGER,
       segunda-escolha [1] IMPLICIT BOOLEAN }

Neste caso, o valor do rótulo (zero ou um) estará presente na codificação gerada pela regras de codificação mas os códigos para identificar que os tipos são INTEGER ou BOOLEAN serão suprimidos. Evidentemente, o receptor devera conhecer a definição dos tipos para saber, pelo rótulo, qual o tipo recebido.

Cada valor de dados a ser codificado terá uma representação consistindo de:

As regras de codificação sempre conduzem o rótulo do tipo, explícita ou implicitamente, bem como alguma representação do valor do tipo. Estas regras constituem outro padrão que aplicadas ao valor de um certo tipo definido pela ASN.1 resultam na especificação completa dos valores daquele tipo durante a transferência.

Exemplo de uso da ASN.1 para descrição de uma estrutura de dados concernente a um registro de pessoa. O registro contem os seguintes campos:

Nome: John T. Smith
Cargo: Director
Numero: 51
Data de admissao: 17 de setembro 1971
Nome da esposa: Mary Smith
Numero de filhos: 2

Informações sobre filhos

Nome: Ralph T. Smith
Data de nascimento: 11 de novembro 1957
Informações sobre filho
Nome: Susan B. Jones
Data de nascimento: 17 de julho de 1959

A descrição formal deste registro, usando a notação padronizada seria:

         Registro pessoal::- [APPLICATION 0] IMPLICIT SET
         { Nome,
           cargo [0] ISO646 String,
           numero NumeroEmpregado,
           dataDeIngresso [1] Date,
           nomeDaEsposa   [2] Name,
           filhos         [3] IMPLICIT SEQUENCE OF
                              InformaçãoFilho DEFAULT { }}
         InformaçãoFilho::- SET
         { Nome,
           dataNascimento [0] Date}
         Nome ::- [APPLICATION 1] IMPLICIT SEQUENCE
          { nome ISO646 String,
            inicial ISO646 String,
            sobrenome ISO646 String,
   
          NumeroEmpregado::- [APPLICATION 2] IMPLICIT INTEGER
          Date ::- [APPLICATION 3] IMPLICIT ISO 646 String -- AAAAMMDD
O valor ou conteúdo de um registro deste tipo seria:
     { nome "John", inicial "T", sobrenome "Smith"},
       titulo "Director",
       numero 51,
       dataDeIngresso "19710917",
       nomeDaEsposa {nome "Mary", inicial "T", sobrenome "Smith"},
       filhos
        {{{nome "Ralph",inicial "T",sobrenome "Smith} ,
           dataDeNascimento "19571111"  },
         {{nome "Susan", inicial "B",sobrenome "Jones"},
          dataDeNascimento =19590717"    }}