![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-11 05:04 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [已结][超级感谢netbenton和其他老师的帮助]IP类型转换 |
| 可打印版本 2,787 / 29 |
| 第1楼 cz1314 | 发表于 2009-01-03 06:23 |
| 初级用户 发帖 43 积分 64 | |
|
[已结][超级感谢netbenton和其他老师的帮助]IP类型转换 现在ip的表示方式有2种:
一种是数字型 例如:3758096383 另一种是大家常用的点分十进制 例如:223.255.255.255 我来解释下这2中ip 格式是如何进行转换的。 这个过程可以用windows的计算器实现, 首先打开科学计算方式,在十进制下输入数字型ip,转换成16进制 比如 3758096383 转换为16进制就是 DFFFFFFF 那么这个IP实际上就是dF.FF.FF.FF 分别把DF和FF转化为十进制,那么就是 223和255 最后的转换结果就是:233.255.255.255。原理比较简单。 我这里有一个文本ip.txt,内容如下: =====txt===== 50331648 50331903 US 50331904 50332671 US 50332672 50332927 US 50332928 50333695 US 50333696 50333951 US ... ... ... ... 50333952 50334719 US ============ 文本中的数字就是 ip地址。 我想写个批处理能把这个文本中的数字型ip 转换成点分十进制格式,并输出到另外一个文本保存。 当中涉及到10进制和16进制的多次转换和输出。由于本人批处理水平太菜,整了3天也没整出来, 特在此请象各位大侠请教,感谢万分! ! ! 感谢各位老师的帮助。 请打下看看下面这段代码如何? 因为ip.txt数据量巨大,有700万条。 ===== ========= [ Last edited by HAT on 2009-1-16 at 15:44 ] |
|
| 第2楼 3742668 | 发表于 2009-01-03 11:06 |
| 荣誉版主 发帖 718 积分 2,013 | |
用for+ping很简单. |
|
| 第3楼 pooronce | 发表于 2009-01-03 11:55 |
| 中级用户 发帖 250 积分 484 | |
| 第4楼 slore | 发表于 2009-01-03 12:20 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
直接ping会转换的……
|
|
| 第5楼 pooronce | 发表于 2009-01-03 12:25 |
| 中级用户 发帖 250 积分 484 | |
Originally posted by slore at 2009-1-3 12:20 PM: ping效率比较低... 能想办法解决31位限制就ok了... |
|
| 第6楼 slore | 发表于 2009-01-03 12:35 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
-n 1 -w 1 速度不算慢
|
|
| 第7楼 pooronce | 发表于 2009-01-03 13:11 |
| 中级用户 发帖 250 积分 484 | |
|
慢的
在大量转换的场合,时间消耗不可胜数的 你看上面,我用0的,随便遇到几个高值ip,就会小卡一会儿了 |
|
| 第8楼 netbenton | 发表于 2009-01-03 15:32 |
| 银牌会员 发帖 752 积分 1,916 来自 广西 | |
|
回复3楼 @echo off
del IP_out.txt>nul for /f "tokens=1,2,3" %%i in (ip.txt) do @call :output %%i %%j %%k type IP_out.txt pause&goto :eof :output set ip1= set ip2= call :ipconv "ip1" %1 call :ipconv "ip2" %2 echo %ip1% %ip2% %3>>IP_out.txt goto :eof :ipconv rem 注意,此过程只能IP首位在127以下,即2147483647最大 if %~2 gtr 2147483646 (echo 数字太大,转呼过程2&call :ipconv2 %1 %2&goto :eof) set ou= :ipconv1 set varname= set tmpIP= set _IP_a= set _IP_b= set _IP_c= set _IP_d= set "varname=%~1" set tmpIP=%2 set /a _IP_a=tmpIP^>^>24 if defined ou set /a _IP_a=_IP_a+128 set /a _IP_b=(tmpIP^>^>16)^&255 set /a _IP_c=(tmpIP^>^>8)^&255 set /a _ip_d=tmpIP^&255 set %varname%=%_IP_a%.%_IP_b%.%_IP_c%.%_IP_d% goto :eof :ipconv2 rem 增加此过程处理IP首位在127以上的代码 set "var=%~2" set varf=%var:~0,1% set varb=1%var:~1% set /a varf=%varf%-2 set /a varb=%varb%-147483648 if %varb% lss 1000000000 set /a varf=varf-1 set /a var=%varf%*1000000000+%varb:~-9% set ou=128 call :ipconv1 %~1 %var% goto :eof |
|
| 第9楼 pooronce | 发表于 2009-01-03 17:06 |
| 中级用户 发帖 250 积分 484 | |
|
思路不错
不过有些东西你没处理好 试下这个ip.txt: 50331648 1033418400 US 4000000001 50332671 US 3549476416 50332927 US 4000000000 50333695 US 4007483643 50333951 US 2123369536 50334719 US |
|
| 第10楼 pooronce | 发表于 2009-01-03 17:09 |
| 中级用户 发帖 250 积分 484 | |
|
改进版来喽:
|
|
| 第11楼 netbenton | 发表于 2009-01-03 18:28 |
| 银牌会员 发帖 752 积分 1,916 来自 广西 | |
|
回复:pooronce 我试了没有问题呀,贴上结果:
3.0.0.0 61.152.182.160 US 238.107.40.1 3.0.3.255 US 211.144.182.64 3.0.4.255 US 238.107.40.0 3.0.7.255 US 238.221.88.251 3.0.8.255 US 126.144.12.64 3.0.11.255 US 请按任意键继续. . . |
|
| 第12楼 pooronce | 发表于 2009-01-03 20:21 |
| 中级用户 发帖 250 积分 484 | |
|
哦。。。贴错,试这个:
50331648 1033418400 US 3500000001 50332671 US 3949476416 50332927 US 3100000001 50333695 US 4207483643 4150333951 US 2123369536 50334719 US 借位与不借位的区别吧。。。 另外有两个数字落空,虽然机率很小,也得处理一下的 [ Last edited by pooronce on 2009-1-3 at 21:38 ] |
|
| 第13楼 cz1314 | 发表于 2009-01-03 22:53 |
| 初级用户 发帖 43 积分 64 | |
|
牛人啊!!谢谢 大侠门了!!佩服!!
|
|
| 第14楼 netbenton | 发表于 2009-01-03 23:13 |
| 银牌会员 发帖 752 积分 1,916 来自 广西 | |
|
改进一下 @echo off
del IP_out.txt>nul for /f "tokens=1,2,3" %%i in (ip.txt) do @call :output %%i %%j %%k type IP_out.txt pause&goto :eof :output set ip1= set ip2= call :ipconv "ip1" %1 call :ipconv "ip2" %2 echo %ip1% %ip2% %3>>IP_out.txt goto :eof :ipconv rem 注意,此过程只能IP首位在127以下,即2147483647最大 if %~2 gtr 2147483646 (echo 数字太大,转呼过程2&call :ipconv2 %1 %2&goto :eof) set ou= :ipconv1 set varname= set tmpIP= set _IP_a= set _IP_b= set _IP_c= set _IP_d= set "varname=%~1" set tmpIP=%2 set /a _IP_a=tmpIP^>^>24 if defined ou set /a _IP_a=_IP_a+128 set /a _IP_b=(tmpIP^>^>16)^&255 set /a _IP_c=(tmpIP^>^>8)^&255 set /a _ip_d=tmpIP^&255 set %varname%=%_IP_a%.%_IP_b%.%_IP_c%.%_IP_d% goto :eof :ipconv2 rem 增加此过程处理IP首位在127以上的代码 set var=%~2 set varf=%var:~0,-9% rem ****** 去掉截串后前导 "0" 就可以了 set varb=1%var:~-9%-1000000000 rem ****** set /a varf=%varf%-2 set /a varb=%varb%-147483648 set /a var=%varf%*1000000000+%varb% set ou=128 call :ipconv1 %~1 %var% goto :eof |
|
| 第15楼 netbenton | 发表于 2009-01-03 23:31 |
| 银牌会员 发帖 752 积分 1,916 来自 广西 | |
|
换种算法看看 @echo off&setlocal enabledelayedexpansion
>IP_out.txt cd. ::此段采用 pooronce君 的代码 for /f "tokens=1,2,3" %%i in (ip.txt) do @call :output %%i %%j %%k type IP_out.txt pause&goto :eof :output set ip1= set ip2= call :ipconv "ip1" %1 call :ipconv "ip2" %2 echo %ip1% %ip2% %3>>IP_out.txt goto :eof ::此段采用 pooronce君 的代码 :ipconv set var=%~2 set vecho= :agin set varf=!var:~0,-6! set varb=!var:~-6! if defined varf ( set /a vs0=!varf!/256 set /a vy0=!varf!^%%256 set /a varb=!vy0!*1000000+4!varb!-4000000 ) set /a vs1=!varb!/256 set /a vy1=!varb!^%%256 if defined vecho (set vecho=!vy1!.!vecho!) else (set vecho=!vy1!) set /a var=!vs0!*1000000+!vs1! if not "!var!"=="0" goto :agin set %~1=%vecho% goto :eof |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |