2000/12/04 [月]
RACE への変換方法は次の通りです。ただし U を UCS または Unicode のコードポイントを表すことにします。また Bxx という表現は左にある U の xx ビット目の値をあらわしています。数字の中の _ は見やすくするために便宜上挿入した記号です。
変換方法
- もし文字列が、RFC1035 で定義されている、つまり [A-Za-z0-9-] で示される文字からなっているときは変換せずに、そのまま値を使用します。
- それ以外のときは、以下のようにして変換します。
- U は UTF-16 表現とします。
- 文字の正規化、禁止文字の使用など検査します。
- 次のようにして、文字列の圧縮を行います。
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); //出力は上位バイトから }
- (DNSの場合)output で出力された、圧縮後のバイナリが 36 バイト以下かどうか検査します。そうでない場合はエラーにする必要があります。
- Base32 エンコードをします。Base32 では MSB から 5 bit ずつ区切り、表 "abcdefghijklmnopqrstuvwxyz234567" を使って変換します ("0" と "1" が使われていないことに注意)。もしビットが足りない場合は、最小限 bit 値 0 を追加し変換します。
- "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