IPタイプへのキャスト
IPタイプは、IPv4とIPv6タイプを含むIPアドレスの格納と処理に使用されます。IPv4はuint32として格納され、IPv6はuint128として格納されます。
IPv4へのキャスト
String から
Strict Mode
BNF Definition
<ipv4> ::= <whitespace>* <octet> "." <octet> "." <octet> "." <octet> <whitespace>*
<octet> ::= <digit> | <digit><digit> | <digit><digit><digit>
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
ルール説明
IPv4アドレスは、ドットで区切られた4つの数値セグメントで構成されます:number.number.number.number、例:192.168.1.1。各セグメントは0から255の範囲内である必要があります。数値は先頭にゼロを含むことができます。アドレスの前後には任意の数の空白文字(スペース、タブ、改行など)を含めることができます。
フォーマットが適合しない場合、エラーが報告されます。
例
| Input String | Parse Result | Comment |
|---|---|---|
| "192.168.1.1" | Success | 標準的な有効なアドレス |
| "0.0.0.0" | Success | 最小値境界 |
| "255.255.255.255" | Success | 最大値境界 |
| "10.20.30.40" | Success | 通常のアドレス |
| " 192.168.1.1 " | Success | 前後に空白文字を含むことができる |
| "192.168.01.1" | Success | 先頭ゼロが許可される(01 = 1) |
| "1.2.3" | Error | セグメントが3つのみ(4つ必要) |
| "1.2.3.4.5" | Error | セグメントが5つ(4つ必要) |
| "256.0.0.1" | Error | 最初のセグメントが255より大きい(256は範囲外) |
| "1.300.2.3" | Error | 2番目のセグメントが255より大きい |
| "1.2.3." | Error | 4番目のセグメントが欠落 |
| ".1.2.3" | Error | 最初のセグメントが欠落 |
| "1..2.3" | Error | 2番目のセグメントが欠落 |
| "a.b.c.d" | Error | 数値以外の文字 |
| "1.2.+3.4" | Error | 符号+は無効 |
非厳密モード
BNF定義
<ipv4> ::= <whitespace>* <octet> "." <octet> "." <octet> "." <octet> <whitespace>*
<octet> ::= <digit> | <digit><digit> | <digit><digit><digit>
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
ルールの説明
IPv4アドレスは、ドットで区切られた4つの数値セグメントで構成されます:number.number.number.number、例:192.168.1.1。各セグメントは0から255の範囲内である必要があります。数値は先頭ゼロを含むことができます。アドレスの前後には任意の数の空白文字(スペース、タブ、改行など)を含むことができます。
フォーマットが適合しない場合、nullが返されます。
例
| Input String | Parse Result | Comment |
|---|---|---|
| "192.168.1.1" | Success | 標準的な有効なアドレス |
| "0.0.0.0" | Success | 最小値の境界 |
| "255.255.255.255" | Success | 最大値の境界 |
| "10.20.30.40" | Success | 通常のアドレス |
| " 192.168.1.1 " | Success | 前後に空白を含むことができる |
| "192.168.01.1" | Success | 先頭ゼロが許可される (01 = 1) |
| "1.2.3" | null | セグメントが3つのみ(4つ必要) |
| "1.2.3.4.5" | null | セグメントが5つ(4つ必要) |
| "256.0.0.1" | null | 最初のセグメントが255より大きい(256は範囲外) |
| "1.300.2.3" | null | 2番目のセグメントが255より大きい |
| "1.2.3." | null | 4番目のセグメントが欠落 |
| ".1.2.3" | null | 最初のセグメントが欠落 |
| "1..2.3" | null | 2番目のセグメントが欠落 |
| "a.b.c.d" | null | 非数値文字 |
| "1.2.+3.4" | null | 符号+は無効 |
IPv6へのキャスト
FROM String
動作変更
バージョン4.0より前では、DorisはIPv6アドレスフォーマットに対してより緩い要件を持っていました。例:
- 連続する複数のコロンを許可('1:1:::1'など)
- 実際に何も省略しないダブルコロンを許可('1:1:1::1:1:1:1:1'など)
バージョン4.0以降、これら2つの非標準フォーマットは厳密モードではエラーになるか、非厳密モードではnullを返します。
厳密モード
BNF定義
<ipv6> ::= <whitespace>* <ipv6-standard> <whitespace>*
| <whitespace>* <ipv6-compressed> <whitespace>*
| <whitespace>* <ipv6-ipv4-mapped> <whitespace>*
<ipv6-standard> ::= <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16>
<h16> ::= <hexdigit>{1,4}
<hexdigit> ::= <digit> | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
ルールの説明
- 標準形式:16進数の8つのグループで構成され、各グループは1から4桁の16進数で、コロンで区切られます。例:2001:0db8:85a3:0000:0000:8a2e:0370:7334
- 圧縮形式:
- ダブルコロン(::)を使用して、連続する1つ以上のゼロのグループを表すことができます。
- ダブルコロン(::)は、アドレス全体で一度だけ使用できます。
- :: だけでも有効なアドレスで、すべてゼロを表します。
- 1:1:1::1:1:1:1:1 は、:: が連続するゼロを表していないため無効です。
- 以下のアドレスはすべて有効で同一です:
- 2001:0db8:0000:0000:0000:0000:1428:57ab
- 2001:0db8:0000:0000:0000::1428:57ab
- 2001:0db8:0:0:0:0:1428:57ab
- 2001:0db8:0::0:1428:57ab
- 2001:0db8::1428:57ab
- IPv4マップアドレス:
- IPv6アドレスの最後の32ビット(最後の2つのグループ)でIPv4のドット区切り10進形式を使用できます。
- この形式は通常、IPv4アドレスのIPv6へのマッピングを表すために使用されます。
- 例:::ffff:192.168.89.9 は ::ffff:c0a8:5909 と同等です
- アドレスの前後には、任意の数の空白文字(スペース、タブ、改行など)を含めることができます。
- 16進数の文字は大文字(A-F)または小文字(a-f)のいずれでも使用できます。
- IPv4部分はIPv4のルールに従う必要があります:各セグメントは0から255の範囲内でなければなりません。
- アドレス形式が上記のルールに適合しない場合、エラーが報告されます。
例
| Input String | Parse Result | Comment |
|---|---|---|
| 2001:db8:85a3:0000:0000:8a2e:0370:7334 | Success | 標準の有効なアドレス |
| :: | Success | すべてゼロのアドレス |
| 2001:db8:: | Success | 圧縮形式を使用 |
| ::ffff:192.168.1.1 | Success | IPv4マップアドレス |
| 2001:db8::1 | Success | 前後に空白文字を含むことができます |
| 2001:db8::1::2 | Error | ダブルコロン(::)が2回出現 |
| 2001:db8:85a3:0000:0000:8a2e:0370:7334:1234 | Error | 8つを超えるグループ |
| 2001:db8:85a3:0000:8a2e:0370 | Error | 6つのグループのみ(8つか圧縮形式を使用する必要があります) |
| 2001:db8:85g3:0000:0000:8a2e:0370:7334 | Error | 無効な16進数文字「g」を含む |
| 2001:db8::ffff:192.168.1.260 | Error | IPv4部分が範囲外(260 > 255) |
| 2001:db8::ffff:192.168..1 | Error | IPv4部分の形式エラー(セグメントが欠落) |
| 2001:0db8:85a3:::8a2e:0370:7334 | Error | 3つのコロンが連続 |
| 20001:db8::1 | Error | 最初のグループが16進数4桁を超過 |
非厳格モード
BNF定義
<ipv6> ::= <whitespace>* <ipv6-standard> <whitespace>*
| <whitespace>* <ipv6-compressed> <whitespace>*
| <whitespace>* <ipv6-ipv4-mapped> <whitespace>*
<ipv6-standard> ::= <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16> ":" <h16>
<h16> ::= <hexdigit>{1,4}
<hexdigit> ::= <digit> | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
ルール説明
- 標準フォーマット:16進数の8つのグループで、各グループは1から4桁の16進数で構成され、コロンで区切られます。例:2001:0db8:85a3:0000:0000:8a2e:0370:7334
- 圧縮フォーマット:
- 二重コロン(::)は、連続する1つ以上の0のグループを表すために使用できます。
- 二重コロン(::)は、アドレス全体で1回のみ使用できます。
- :: だけでも有効なアドレスで、すべて0を表します。
- 1:1:1::1:1:1:1:1 は無効です。:: が連続する0を表していないためです。
- 以下のアドレスはすべて有効で同一です:
- 2001:0db8:0000:0000:0000:0000:1428:57ab
- 2001:0db8:0000:0000:0000::1428:57ab
- 2001:0db8:0:0:0:0:1428:57ab
- 2001:0db8:0::0:1428:57ab
- 2001:0db8::1428:57ab
- IPv4マップアドレス:
- IPv6アドレスの下位32ビット(最後の2グループ)でIPv4ドット記法を使用できます。
- このフォーマットは通常、IPv4アドレスをIPv6にマッピングする際に使用されます。
- 例:::ffff:192.168.89.9 は ::ffff:c0a8:5909 と同等です
- アドレスの前後には、任意の数の空白文字(スペース、タブ、改行など)を含めることができます。
- 16進数の文字は大文字(A-F)または小文字(a-f)で記述できます。
- IPv4部分はIPv4ルールに従う必要があります:各セグメントは0から255の範囲内である必要があります。
- アドレスフォーマットが上記のルールに適合しない場合、null が返されます。
例
| 入力文字列 | 解析結果 | コメント |
|---|---|---|
| 2001:db8:85a3:0000:0000:8a2e:0370:7334 | 成功 | 標準的な有効アドレス |
| :: | 成功 | すべて0のアドレス |
| 2001:db8:: | 成功 | 圧縮フォーマットを使用 |
| ::ffff:192.168.1.1 | 成功 | IPv4マップアドレス |
| 2001:db8::1 | 成功 | 前後に空白文字を含むことができます |
| 2001:db8::1::2 | null | 二重コロン(::)が2回出現 |
| 2001:db8:85a3:0000:0000:8a2e:0370:7334:1234 | null | 8グループを超過 |
| 2001:db8:85a3:0000:8a2e:0370 | null | 6グループのみ(8グループまたは圧縮フォーマットが必要) |
| 2001:db8:85g3:0000:0000:8a2e:0370:7334 | null | 無効な16進数文字 'g' を含む |
| 2001:db8::ffff:192.168.1.260 | null | IPv4部分が範囲外(260 > 255) |
| 2001:db8::ffff:192.168..1 | null | IPv4部分のフォーマットエラー(セグメントが不足) |
| 2001:0db8:85a3:::8a2e:0370:7334 | null | 3つのコロンが連続 |
| 20001:db8::1 | null | 最初のグループが16進数4桁を超過 |
IPv4から変換
任意のIPv4アドレスをIPv6に変換できます。変換は常に成功し、strictモードと非strictモード間で動作は一致します。
| 入力IPv4 | 変換後IPv6 |
|---|---|
| 192.168.0.0 | ::ffff:192.168.0.0 |
| 0.0.0.0 | ::ffff:0.0.0.0 |