Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CIDR转换为IP范围的MySQL查询_Mysql_Cidr - Fatal编程技术网

将CIDR转换为IP范围的MySQL查询

将CIDR转换为IP范围的MySQL查询,mysql,cidr,Mysql,Cidr,我有一个表,其中包含一列作为CIDR值,如1.0.85.128/25,我还有两列(start\u ip\u range和end\u ip\u range),我想从CIDR列填充这两列 Java代码可能如下所示: String[] parts = cidr.split("/"); String ip = parts[0]; int prefix; if (parts.length < 2) { prefix = 0; } else { prefix = Integer.par

我有一个表,其中包含一列作为CIDR值,如
1.0.85.128/25
,我还有两列(start\u ip\u range和end\u ip\u range),我想从CIDR列填充这两列

Java代码可能如下所示:

String[] parts = cidr.split("/");
String ip = parts[0];
int prefix;
if (parts.length < 2) {
    prefix = 0;
} else {
    prefix = Integer.parseInt(parts[1]);
}

String[] ipParts = ip.split("\\.");
int address = ((new Integer(ipParts[0]) << 24) & 0xFF000000) 
    | ((new Integer(ipParts[1]) << 16) & 0xFF0000) 
    | ((new Integer(ipParts[2]) << 8) & 0xFF00) 
    | (new Integer(ipParts[3]) & 0xFF);
int mask = (-1) << (32 - prefix);
int start = address & mask;
int end = start + (~mask);
String[]parts=cidr.split(“/”);
字符串ip=部件[0];
int前缀;
如果(零件长度<2){
前缀=0;
}否则{
前缀=整数.parseInt(部分[1]);
}
字符串[]ipParts=ip.split(“\\”);
int address=((新整数(ipParts[0])您可以将其转换为

查询

SELECT
  INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) 
   & 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(val, '/', -1))  ) -1 )) from_ip,
  INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) 
   | ((0x100000000 >> SUBSTRING_INDEX(val, '/', -1) ) -1 )) to_ip
FROM cidr;
也可以在虚拟列中使用它,这样就可以直接得到正确的值

虚拟字段

CREATE TABLE `cidr1` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `val` VARCHAR(32) DEFAULT NULL,
  `from_ip` VARCHAR(15) AS ( INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) & 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(val, '/', -1))  ) -1 ))) PERSISTENT ,
  `to_ip` VARCHAR(15)  AS ( INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) | ((0x100000000 >> SUBSTRING_INDEX(val, '/', -1) ) -1 ))) PERSISTENT ,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `cidr1` (`id`, `val`)
VALUES
    (1, '192.168.2.12/24'),
    (2, '192.168.2.12/25'),
    (3, '1.0.85.128/25'),
    (4, '192.168.2.12/32');


MariaDB []> select * from cidr1;
+----+-----------------+--------------+---------------+
| id | val             | from_ip      | to_ip         |
+----+-----------------+--------------+---------------+
|  1 | 192.168.2.12/24 | 192.168.2.0  | 192.168.2.255 |
|  2 | 192.168.2.12/25 | 192.168.2.0  | 192.168.2.127 |
|  3 | 1.0.85.128/25   | 1.0.85.128   | 1.0.85.255    |
|  4 | 192.168.2.12/32 | 192.168.2.12 | 192.168.2.12  |
+----+-----------------+--------------+---------------+
4 rows in set (0.00 sec)

MariaDB []>
创建表'cidr1`(
`id`INT(11)无符号非空自动增量,
`val`VARCHAR(32)默认为空,
`从_ip`VARCHAR(15)作为(INET_NTOA(INET_ATON(SUBSTRING_索引(val,'/',1))&0xffffffff^((0x1>SUBSTRING_索引(val,'/',1))-1))持久,
主键(`id`)
)ENGINE=INNODB默认字符集=utf8;
插入到'cidr1'('id','val')中
价值观
(1, '192.168.2.12/24'),
(2, '192.168.2.12/25'),
(3, '1.0.85.128/25'),
(4, '192.168.2.12/32');
MariaDB[]>从cidr1中选择*;
+----+-----------------+--------------+---------------+
|id | val |从| ip |到| ip|
+----+-----------------+--------------+---------------+
|  1 | 192.168.2.12/24 | 192.168.2.0  | 192.168.2.255 |
|  2 | 192.168.2.12/25 | 192.168.2.0  | 192.168.2.127 |
|  3 | 1.0.85.128/25   | 1.0.85.128   | 1.0.85.255    |
|  4 | 192.168.2.12/32 | 192.168.2.12 | 192.168.2.12  |
+----+-----------------+--------------+---------------+
一组4行(0.00秒)
MariaDB[]>

感谢您的转换例程。在编辑时使用了它。+1通过从\u ip和到\u ip转换为CIDR来反转操作如何?
CREATE TABLE `cidr1` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `val` VARCHAR(32) DEFAULT NULL,
  `from_ip` VARCHAR(15) AS ( INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) & 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(val, '/', -1))  ) -1 ))) PERSISTENT ,
  `to_ip` VARCHAR(15)  AS ( INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) | ((0x100000000 >> SUBSTRING_INDEX(val, '/', -1) ) -1 ))) PERSISTENT ,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `cidr1` (`id`, `val`)
VALUES
    (1, '192.168.2.12/24'),
    (2, '192.168.2.12/25'),
    (3, '1.0.85.128/25'),
    (4, '192.168.2.12/32');


MariaDB []> select * from cidr1;
+----+-----------------+--------------+---------------+
| id | val             | from_ip      | to_ip         |
+----+-----------------+--------------+---------------+
|  1 | 192.168.2.12/24 | 192.168.2.0  | 192.168.2.255 |
|  2 | 192.168.2.12/25 | 192.168.2.0  | 192.168.2.127 |
|  3 | 1.0.85.128/25   | 1.0.85.128   | 1.0.85.255    |
|  4 | 192.168.2.12/32 | 192.168.2.12 | 192.168.2.12  |
+----+-----------------+--------------+---------------+
4 rows in set (0.00 sec)

MariaDB []>