高分!超难!:脚本实现IP地址范围格式的批量转换

drifter250771 2011-08-22 12:48:29
113.64.0.0/10 需要被转换成 133.64.0.0 133.127.255.255
14.16.0.0/12 需要被转换成 14.16.0.0 14.31.255.255
1.68.0.0/14 需要被转换成 1.68.0.0 1.71.255.255
58.83.0.0/16 需要被转换成 58.83.0.0 58.83.255.255
61.134.0.0/18 需要被转换成 61.134.0.0 61.134.63.255
1.92.0.0/20 需要被转换成 1.92.0.0 1.92.15.255
59.151.52.0/22 需要被转换成 59.151.52.0 59.151.55.255
59.151.1.0/24 需要被转换成 59.151.1.0 59.151.1.255

不多解释,专家一看上面的转化方式就该了解是怎样一个规律。
以上只是范例,掩码长度为从10-24都有可能。
如果只是这几条我完全可以口算或借助计算工具,问题现在是这个C:\IP.txt里有数千条这样的记录需要转化,求脚本实现

注:C:\IP.txt的内容格式跟上面一样:

113.64.0.0/10
14.16.0.0/12
1.68.0.0/14
58.83.0.0/16
61.134.0.0/18
1.92.0.0/20
59.151.52.0/22
59.151.1.0/24
...
....
.....
...全文
377 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
drifter250771 2011-08-23
  • 打赏
  • 举报
回复
该帖已达到分数最大值,不允许加分操作。


佩服羊兄,也感谢Microogle,接次序结贴给分
drifter250771 2011-08-22
  • 打赏
  • 举报
回复
按我对这论坛此版块的了解程度,据我预期,能解决这个问题的也就那么几个人。
哥们,有时间的话就帮我琢磨一下,感激不尽
glasses1999 2011-08-22
  • 打赏
  • 举报
回复
300分,飘过。。。。。。。
Forever_Young 2011-08-22
  • 打赏
  • 举报
回复
我靠,出这么多分这不存心让人纠结么,能再加点分让我等更纠结点么,俗话说重赏之下必有勇夫,大家也可以就着这个题目探讨共同提高撒。

看了下你的要求,其实不算超难,唯一有点难度的就是子网掩码的ip要算出来,算出了子网掩码ip再算出广播地址也就很容易了。
mingpei0703 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 drifter250771 的回复:]
按我对这论坛此版块的了解程度,据我预期,能解决这个问题的也就那么几个人。
哥们,有时间的话就帮我琢磨一下,感激不尽
[/Quote]
我不会,但也不要小看潜伏在三角里的高手,据我所知很有些都不屑来这!
Microogle 2011-08-22
  • 打赏
  • 举报
回复
实用至上吧,碰到情况了什么来得快用什么吧.
bat慢慢地远去了。
Forever_Young 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 microogle 的回复:]
还是用vbs和js感觉比较爽一些.
信手写的,请LZ自行测试有无bug并更改.
p.s:LS基本功真扎实,稍微麻烦一点俺都用vbs了.
[/Quote]

还是要时不时的多写点,这玩意很容易丢生的,留着食之无味,丢了有时候还用得着
Microogle 2011-08-22
  • 打赏
  • 举报
回复 1
好久没来,一来就碰到有题做,练练手:

@echo off
for /f "delims=./ tokens=1,2,3,4,5" %%a in (x.txt) do (
call :sub %%a %%b %%c %%d %%e
)
pause
goto :eof
rem code by 3742668
:sub
set num1=%4
set num2=%3
set num3=%2
set num4=%1
set /a m=(32-%5)%%8
set /a n=((32-%5)/8)
for /l %%i in (1,1,%n%) do set /a num%%i+=255
set /a n+=1
set /a num%n%+=(1^<^<%m%)-1
echo %1.%2.%3.%4--%num4%.%num3%.%num2%.%num1%
echo ===================================
goto :eof

还是用vbs和js感觉比较爽一些.
信手写的,请LZ自行测试有无bug并更改.
p.s:LS基本功真扎实,稍微麻烦一点俺都用vbs了.
  • 打赏
  • 举报
回复
网上有代码的。
看看这个有用不
http://forums.overclockers.com.au/showthread.php?t=278752
Forever_Young 2011-08-22
  • 打赏
  • 举报
回复
上面那个是二进制转换的,再写个十六进制转换的

[code=BatchFile]
::Forever Young [2011]
@echo off
set str=0123456789abcdef
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=/" %%a in (%~dp0\ip.txt) do (
set /a "snm=(1<<(32-%%b))-1"
call :hex !snm! %%a
)
pause

:hex
set hexstr=
set /a a=%1
set ip=%2
:loop
set /a b=%a% %% 16 & set /a a=%A% / 16
set hexstr=!str:~%b%,1!%hexstr%
if %a% gtr 0 goto :loop
set hexstr=00000000%hexstr%
set hexstr=%hexstr:~-8%
for /f "tokens=1-4 delims=." %%a in ("%ip%") do (set a1=%%a&set a2=%%b&set a3=%%c&set a4=%%d)
set b1=0x%hexstr:~0,2%&set b2=0x%hexstr:~2,2%&set b3=0x%hexstr:~4,2%&set b4=0x%hexstr:~-2%
for /l %%j in (1,1,4) do (set /a ip%%j=b%%j+a%%j)
echo %ip% ------ %ip1%.%ip2%.%ip3%.%ip4%
[/code]
Forever_Young 2011-08-22
  • 打赏
  • 举报
回复
那小弟就写个,献丑了,各位潜水高人现身拍砖。

我就不做标注了,该看得懂的人自然看得懂

[code=BatchFile]
::Forever Young [2011]
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=/" %%a in (%~dp0\ip.txt) do (
set binSNM=
for /l %%z in (1,1,%%b) do (set binSNM=!binSNM!1)
set /a s0=32-%%b
for /l %%z in (1,1,!s0!) do (set binSNM=!binSNM!0)
call :convSNM !binSNM! %%a
)
pause

:convSNM
set snm=*%1
set ip=%2
for /l %%s in (1,1,32) do (set sbin%%s=!snm:~%%s,1!)
set ipValue=128
set vCount=0
set c=0
set snmIP=

:loopSNM
set /a c=!c!+1
if "!sbin%c%!"=="1" set /a vCount=!vCount!+!ipValue!
if !ipValue! equ 1 (
set snmIP=!snmIP!!vCount!
set vCount=0
set ipValue=256
if !c! lss 32 set snmIP=!snmIP!.
)
set /a ipValue=!ipValue!/2
if !c! lss 32 goto loopSNM

for /f "tokens=1-4 delims=." %%a in ("%ip%") do (set a1=%%a&set a2=%%b&set a3=%%c&set a4=%%d)
for /f "tokens=1-4 delims=." %%e in ("%snmip%") do (set b1=%%e&set b2=%%f&set b3=%%g&set b4=%%h)
for /l %%j in (1,1,4) do (set /a "a%%j&=b%%j"&set /a "ip%%j=(b%%j^255)+a%%j")

echo %ip% --------- %ip1%.%ip2%.%ip3%.%ip4%
[/code]
drifter250771 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 forever_young 的回复:]
要是VBS那就很简单了,纯批处理呢?
[/Quote]

哈哈,这个...我表示望洋兴叹,必须拜托羊兄了
Forever_Young 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 drifter250771 的回复:]
找到窍门了,很容易,这只是一个数学问题。
以192.168.0.0/24为例:

192.168.0.0 转化成16进制得到C0A80000
2^(32-24)-1=255 转化成16进制得到FF
C0A80000+FF=C0A800FF 重新转化成IP地址得到192.168.0.255

其它与此类推,有了上面这个流程图,对VBS来说,具体的实现,就只剩几个字符串操作函数的运用问题……
[/Quote]

要是VBS那就很简单了,纯批处理呢?
drifter250771 2011-08-22
  • 打赏
  • 举报
回复
找到窍门了,很容易,这只是一个数学问题。
192.168.0.0/24为例:

192.168.0.0 转化成16进制得到C0A80000
2^(32-24)-1=255 转化成16进制得到FF
C0A80000+FF=C0A800FF 重新转化成IP地址得到192.168.0.255

其它与此类推,有了上面这个流程图,对VBS来说,具体的实现,就只剩几个字符串操作函数的运用问题了,没有赘述的价值。

6,850

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧