2

IP バージョン 6 http://www.ip2location.com/free/ipv6用の単純な IP から国へのデータベースがあります 。

CREATE TABLE `ip2location_ipv6`(
    `ip_from` DOUBLE,
    `ip_to` DOUBLE,
    `ipv6_from` VARCHAR(40),
    `ipv6_to` VARCHAR(40),
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

このデータベースのサンプル行の値:

"42540528726795050063891204319802818560", "42540528806023212578155541913346768895", "2001:200::", "2001:200:ffff:ffff:ffff:ffff:ffff:ffff", "JP", "Japan"

今、私はIPアドレスの国名を取得したい. これは私のSQLです:

SQL = "SELECT country_code FROM ip2location_ipv6 WHERE " & IPNumber & " BETWEEN ip_from AND ip_to"

この sql には、IPNumber というパラメーターがあります。IPV4 では、IPNumber を簡単に計算できます。

IPV4: a.b.c.d  => IPNumber = a*(256*256*256) + b*(256*256) + C*(256) + d

または私はそれを行うことができます

IPNumber = (long)(uint)IPAddress.NetworkToHostOrder((int)IPAddress.Parse("IP_address_Version_4").Address);

しかし、C# で IPV6 を解決する方法はありません。たとえば、このデータベースでこのIPの国名「2001:DB8::dcaf:BAD」を検索したい

4

2 に答える 2

1

バイナリから標準の IPv6 表記に変換するには:

IPAddressクラスをpublic IPAddress(byte[] address)コンストラクターで使用します。

コンストラクターで IPv6 アドレスのバイト配列を渡し、.ToString()メソッドを使用してそれを標準表記法で出力します。


標準の IPv6 表記からバイナリに変換するには:

新しいIPAddressオブジェクトを作成IPAddress.TryParse(string standardNotation)し、標準表記文字列からバイナリ値に変換するために使用します。

于 2012-05-06T07:46:47.737 に答える
0

最新バージョンの mysql 5.6 を使用できます。すでに IPv6 とコマンド INET6_ATON()、INET6_NTOA() をサポートしています。

あなたのテーブルは -

CREATE TABLE `ip2location_ipv6`(
    `ip_from` int(11) unsigned,
    `ip_to` int(11) unsigned,
    `ipv6_from` varbinary(16),
    `ipv6_to` varbinary(16),
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
于 2013-04-08T13:39:01.833 に答える