IPタイプへのキャスト
IPタイプは、IPv4およびIPv6タイプを含むIPアドレスの保存と処理に使用されます。IPv4はuint32として保存され、IPv6はuint128として保存されます。
IPv4へのキャスト
String から
Strict Mode
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の範囲内である必要があります。数値には先頭ゼロを含めることができます。アドレスの前後には任意の数の空白文字(スペース、タブ、改行など)を含めることができます。
形式が適合しない場合、エラーが報告されます。
例
| 入力文字列 | 解析結果 | コメント |
|---|---|---|
| "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が返されます。
例
| 入力文字列 | 解析結果 | コメント |
|---|---|---|
| "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つの非標準形式は、strictモードでエラーになるか、非strictモードでnullを返します。
Strictモード
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: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の範囲内である必要があります。
- アドレス形式が上記のルールに従わない場合、エラーが報告されます。
例
| 入力文字列 | パース結果 | コメント |
|---|---|---|
| 2001:db8:85a3:0000:0000:8a2e:0370:7334 | 成功 | 標準的な有効アドレス |
| :: | 成功 | すべてゼロのアドレス |
| 2001:db8:: | 成功 | 圧縮形式を使用 |
| ::ffff:192.168.1.1 | 成功 | IPv4マップアドレス |
| 2001:db8::1 | 成功 | 前後に空白を含めることができます |
| 2001:db8::1::2 | エラー | ダブルコロン(::)が2回出現 |
| 2001:db8:85a3:0000:0000:8a2e:0370:7334:1234 | エラー | 8つを超えるグループ |
| 2001:db8:85a3:0000:8a2e:0370 | エラー | 6つのグループのみ(8つまたは圧縮形式を使用する必要があります) |
| 2001:db8:85g3:0000:0000:8a2e:0370:7334 | エラー | 無効な16進文字「g」を含む |
| 2001:db8::ffff:192.168.1.260 | エラー | IPv4部分が範囲外(260 > 255) |
| 2001:db8::ffff:192.168..1 | エラー | IPv4部分の形式エラー(セグメントが不足) |
| 2001:0db8:85a3:::8a2e:0370:7334 | エラー | 3つのコロンが連続 |
| 20001:db8::1 | エラー | 最初のグループが4桁の16進数を超過 |
非厳密モード
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: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の範囲内である必要があります。
- アドレス形式が上記のルールに適合しない場合、nullが返されます。
例
| 入力文字列 | パース結果 | コメント |
|---|---|---|
| 2001:db8:85a3:0000:0000:8a2e:0370:7334 | 成功 | 標準の有効なアドレス |
| :: | 成功 | すべてゼロのアドレス |
| 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 |