seclan のほえほえルーム

| |

RACE への変換方法

・
2000/12/04 []

 RACE への変換方法は次の通りです。ただし U を UCS または Unicode のコードポイントを表すことにします。また Bxx という表現は左にある U の xx ビット目の値をあらわしています。数字の中の _ は見やすくするために便宜上挿入した記号です。

変換方法

  1. もし文字列が、RFC1035 で定義されている、つまり [A-Za-z0-9-] で示される文字からなっているときは変換せずに、そのまま値を使用します。
  2. それ以外のときは、以下のようにして変換します。
  3. U は UTF-16 表現とします。
  4. 文字の正規化、禁止文字の使用など検査します。
  5. 次のようにして、文字列の圧縮を行います。
    Uu * 256 + Uv = U とし、
    入力文字列を U0 U1 ... Un とするとき、
    
    if({Uu0, Uu1, ... Uun} ∈ {Ubase} || 
      {Uu0, Uu1, ... Uun} ∈ {0, Ubase}){
        //つまり、Uu0, ... Uun 全てが Ubase である、
        //または全てが 0 か Ubase のどれかであるとき
     output(Ubase);
     for(i = 0; i <= n; i++){
      Uu * 256 + Uv = Ui;
      if(Uu == Ubase){
       output(Uv);
       if(Uv == 0xff)	output(0x99);
      } else { //条件 {0, Ubase} のときの Uu == 0 の場合
       output(0xff), output(Uv);
      }
     }
    } else { //圧縮できない
     output(0xd8), output(U0, ..., Un); //出力は上位バイトから
    }
  6. (DNSの場合)output で出力された、圧縮後のバイナリが 36 バイト以下かどうか検査します。そうでない場合はエラーにする必要があります。
  7. Base32 エンコードをします。Base32 では MSB から 5 bit ずつ区切り、表 "abcdefghijklmnopqrstuvwxyz234567" を使って変換します ("0" と "1" が使われていないことに注意)。もしビットが足りない場合は、最小限 bit 値 0 を追加し変換します。
  8. "bq--" を先頭につけます。(DNS の場合、大文字小文字を区別しないので Bq--, bQ-- などを受け付ける必要があります)

変換例

  • 漢字 (0x226F 0x575B) → 変換 → 
    D8_22_6F_57_5B → 
    1101_1000 0010_0010 0110_1111 0101_0111 0101_1011 → 
    11011 00000 10001 00110 11110 10101 11010 11011 → 
    27 0 17 6 30 21 26 27 → 
    3 a r g 6 v 2 3 → 
    "bq--3arg6v23" (すなわちバイト列 62712D2D3361726736763233)


by seclan

関連


| |

 

配信

4.79 msec