BER(Basic Encoding Rules)

BERは元々はASN.1で定義された唯一のコード化方法でした。 1985年の仕様からASN.1はデータ型の記述言語とコード化の定義が分離され、 他のコード化も可能とされ、実際に1994年にPERが定義されました。 現在でのBERおよびBERから派生したCERとDERがASN.1のコード化方法の主流です。

1. TLV符号化

BERはTLV符号化とよばれる基本技術を用いています。 TLV符号化は情報の符号化を情報タイプ(Type)、長さ(Length)、値(Value)の3つで構成します。 符号化データを解釈する場合、情報タイプにより情報の種別を特定でき、長さにより情報の終端を検知します。

  1. タグフィールド:ASN.1データ型を示す。
  2. 長さフィールド:符号化された情報オブジェクトの値の長さを示す。
  3. 内容フィールド:符号化された情報オブジェクトの値を収容する。

単純型の場合の内容フィールドはコード化された情報で、 構造型のの内容フィールドはTLV符号化された情報の並びになります。

構造

2. ビットの並び

BERはデータを8ビットのオクテット単位で符号化します。 オクテットの並びは、最上位オクテットから最下位オクテットへ、 左から順に第1オクテット、第2オクテット....第nオクテットと並べます。 ネットワークで送信する場合は最上位オクテットから最下位オクテットへ向かう順序で送信します。

送信順序

オクテット内は最上位ビットをビット8(MSB:Most Significant Bit)と呼び、 最下位ビットをビット1(LSB:Least Significant Bit)と呼びます。

ビット番号

3. タグの符号化

タグフィールドは「汎用」「応用」「文脈特定」「私用」の4つのクラスを識別するに2ビット使用し、 基本型と構造型の区別のために1ビットを使用し、残りのビットを用いてタグ番号を表現します。 0〜30の範囲のタグ番号は5ビットでコード化し、全部で1オクテットに収めます。 31以上のタグ番号を使用する場合は、最初のオクテットの5ビットはオール1を設定し、 続くオクテットでタグ番号を表します。 各オクテットの最上位ビットはタグフィールドの最終オクテットか否かを表します。

タグ番号 コード化 クラス:
 00:汎用
 01:応用
 10:文脈特定
 11:私用
P/C:
 0:基本型
 1:構造型
0〜30 タグ短い形式
31〜 タグ長い形式

BERの符号化で、タグ自身も符号化されます。 例えば、以下の定義の場合、これは通常二重のTLV符号化になります。

TelephoneNumber ::= [1] NumericString

TelephoneNumber ::= [1] NumericString

元の型のタグを省略する場合は、IMPLICITというキーワードを入れます。

TelephoneNumber ::= [1] IMPLICIT NumericString

TelephoneNumber ::= [1] IMPLICIT NumericString

逆にEXPLICITというキーワードを入れると、二重のTLV符号化になります。

4. 長さの符号化

符号化データの長さが127オクテット以下の場合、 長さフィールドは短形式(Short Definite)と呼ばれる1オクテットで符号化します。 この場合最上位ビットを0に設定し、残りの7ビットで長さを表します。

短形式

符号化データの長さが128オクテット以上の場合、 長さフィールドは長形式(Long Definite)と呼ばれる2オクテット以上に符号化します。 1オクテット目は最上位ビットを1に設定し、残りの7ビットで、実際の長さフィールドの、 長さのオクテット数(1〜126)を表します。127はもしもこれ以上の長さが必要な場合に備えて予約です。

長形式

構造型の場合、可変長形式(Inefinite)と呼ばれる符号化があります。 これは、長さフィールドは、1オクテットで最上位ビットを1、残りを0に設定します。 内容フィールド(これはTLV符号化された情報の並びになります)の終端の検出は、 最後に2オクテットの0を設定する事で行います。

可変長形式

5. 内容の符号化

内容フィールドの形式はタグに依存します。

論理型
(BOOLEAN)
1オクテットの基本型で値で符号化します。FALSEは0で、TRUEは0以外です。
ヌル型
(NULL)
ヌル型は長さが0の基本型で、内容フィールドは存在しません。
整数型
(INTEGER)
基本型で符号化しす。整数値を2の補数表現で符号化します。
実数型
(REAL)
一般的なコンピュータの実数の符号化方法とは異なります。説明は省略。
列挙型
(ENUMERATED)
列挙値に対する整数値を整数と同じように符号化します。
ビット列型
(BIT STRING)
基本型でも構造型でも符号化できます。 基本型の場合、最初の1オクテットは、最終オクテットの未使用ビット数(0〜7)を示し、 残りはビット列をそのまま符号化します。 未使用ビットは0でも1でもかまいません。 基本型の場合で、ビット列の長さが0の場合、長さを0とし、内容フィールドが存在しなくてもかまいません。 構造型の場合、基本型の並びを符号化します。
オクテット列型
(OCTET STRING)
基本型でも構造型でも符号化できます。 基本型の場合オクテット列をそのまま符号化します。 構造型の場合は、基本型の並びを符号化します。
オブジェクト識別子型
(OBJECT IDENTIFIER)
基本型で符号化します。オブジェクト識別子の数字列を順番に符号化します。詳細は略。
(制限)文字列型
(...String)
オクテット列型と同じように符号化します。
選択型
(CHOICE)
選択型はそれ自体はBERでコード化されず、選択型の選択されたものをコード化するだけです。
順序列型
(SEQUENCE)
構造型で符号化します。内容フィールドは、順序列型の内容を順番に符号化したものです。
単一順序列型
(SEQUENCE OF)
順序列型と同じに符号化ます。
集合型
(SET)
順序が任意であることを除き、順序列型と同じに符号化ます。
単一集合型
(SET-OF)
順序列型と同じに符号化ます。

記述内容について一切保障しません。リンクは自由に行ってかまいません。
Since 2006/6/19, Final update 2006/7/8, Presented by Ishida So