标题: [文本处理] [已解决]批处理怎样把点分十进制的IP转换为数字? [打印本页]
作者: bobgjs 时间: 2010-7-13 22:22 标题: [已解决]批处理怎样把点分十进制的IP转换为数字?
ip.txt内容如下:
222.248.240.1 222.248.241.254 广东省深圳市福田区 天威有线宽带(关内)
222.248.242.1 222.248.243.254 广东省深圳市 天威有线宽带(关内)
通过批处理后结果如下:
3740856321 3740856830 广东省深圳市福田区 天威有线宽带(关内)
3740856833 3740857342 广东省深圳市 天威有线宽带(关内)
请给予指点,谢谢
感谢三楼“neorobin ”的指点,处理显示完全达到要求。与此同时,我想再请教:IP.txt通过处理后生成IP2.txt,在这段代码中需要怎么改进?-
- @echo off
- setlocal enableDelayedExpansion
- for /f "delims=" %%l in (ip.txt) do (
- set "cnt=0"
- for %%i in (%%l) do (
- set /a cnt+=1
- if !cnt! leq 2 (
- set tt=%%i
- REM set /a (((222)*256+248)*256+240)*256+1 这种形式的结果将超出批处理计算范围, 故不可用
- set "sum=0"
- for %%t in (!tt:.^= !) do (
- call :cen !sum! 256 sum
- call :jia !sum! %%t sum
- )
- set /p=!sum! <nul
- ) else set /p= %%i<nul
- )
- echo.
- )
- pause
- exit /b
-
- :jia 加法函数(封装)by @随风 @bbs.bathome.net
- ::计算任意位数的正整数加法
- setlocal enabledelayedexpansion&set f=&set "t="
- set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
- for /l %%a in (0 1 9) do (set vard1=&set "vard2="
- set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
- for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
- for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
- (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
- set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
- for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
- set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
- set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
- if !j! neq 0 set "t=!j!!t!"
- Endlocal&set %~3=%t%&goto :EOF
-
- :cen 乘法函数(封装)by @随风 @bbs.bathome.net
- ::计算任意位数的正整数乘法
- setlocal enabledelayedexpansion
- if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
- if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
- set f=&set jia=&set ji=&set /a n1=0,n2=0
- set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
- for /l %%a in (0 1 9) do (
- set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
- for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
- for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
- if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
- for %%a in (!vard1!) do (set "t="&set /a j=0
- for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
- set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
- set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
- set "ji=!t:~-1!!ji!"
- if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
- set jia=!ss!!t:~0,-1!)
- if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
- set "ji=!t!!ji:~1!"
- Endlocal&set %~3=%ji%&goto :EOF
复制代码
[ 本帖最后由 bobgjs 于 2010-7-20 12:55 编辑 ]
作者: CUer 时间: 2010-7-13 23:07
- gawk -F "[ .]+" "{$1=256^3*$1+256^2*$2+256*$3+$4;$2=256^3*$5+256^2*$6+256*$7+$8;print $1,$2,$9,$10}" 1.txt >2.txt
复制代码
作者: neorobin 时间: 2010-7-14 00:11
- @echo off
- setlocal enableDelayedExpansion
- for /f "delims=" %%l in (ip.txt) do (
- set "cnt=0"
- for %%i in (%%l) do (
- set /a cnt+=1
- if !cnt! leq 2 (
- set tt=%%i
- REM set /a (((222)*256+248)*256+240)*256+1 这种形式的结果将超出批处理计算范围, 故不可用
- set "sum=0"
- for %%t in (!tt:.^= !) do (
- call :cen !sum! 256 sum
- call :jia !sum! %%t sum
- )
- set /p=!sum! <nul
- ) else set /p= %%i<nul
- )
- echo.
- )
- pause
- exit /b
-
- :jia 加法函数(封装)by @随风 @bbs.bathome.net
- ::计算任意位数的正整数加法
- setlocal enabledelayedexpansion&set f=&set "t="
- set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
- for /l %%a in (0 1 9) do (set vard1=&set "vard2="
- set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
- for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
- for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
- (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
- set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
- for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
- set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
- set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
- if !j! neq 0 set "t=!j!!t!"
- Endlocal&set %~3=%t%&goto :EOF
-
- :cen 乘法函数(封装)by @随风 @bbs.bathome.net
- ::计算任意位数的正整数乘法
- setlocal enabledelayedexpansion
- if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
- if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
- set f=&set jia=&set ji=&set /a n1=0,n2=0
- set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
- for /l %%a in (0 1 9) do (
- set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
- for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
- for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
- if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
- for %%a in (!vard1!) do (set "t="&set /a j=0
- for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
- set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
- set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
- set "ji=!t:~-1!!ji!"
- if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
- set jia=!ss!!t:~0,-1!)
- if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
- set "ji=!t!!ji:~1!"
- Endlocal&set %~3=%ji%&goto :EOF
复制代码
[ 本帖最后由 neorobin 于 2010-7-14 00:12 编辑 ]
作者: neorobin 时间: 2010-7-14 12:36 标题: 再回楼主
稍作修改即可 输出 到文件, 将原来的关键输出代码 全部 括起, 如下重新安排复制代码
做好后便是- @echo off
- setlocal enableDelayedExpansion
- >ip2.txt (
- for /f "delims=" %%l in (ip.txt) do (
- set "cnt=0"
- for %%i in (%%l) do (
- set /a cnt+=1
- if !cnt! leq 2 (
- set tt=%%i
- REM set /a (((222)*256+248)*256+240)*256+1 这种形式的结果将超出批处理计算范围, 故不可用
- set "sum=0"
- for %%t in (!tt:.^= !) do (
- call :cen !sum! 256 sum
- call :jia !sum! %%t sum
- )
- set /p=!sum! <nul
- ) else set /p= %%i<nul
- )
- echo.
- )
- )
- start ip2.txt
- pause
- exit /b
-
- :jia 加法函数(封装)by @随风 @bbs.bathome.net
- ::计算任意位数的正整数加法
- setlocal enabledelayedexpansion&set f=&set "t="
- set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
- for /l %%a in (0 1 9) do (set vard1=&set "vard2="
- set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
- for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
- for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
- (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
- set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
- for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
- set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
- set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
- if !j! neq 0 set "t=!j!!t!"
- Endlocal&set %~3=%t%&goto :EOF
-
- :cen 乘法函数(封装)by @随风 @bbs.bathome.net
- ::计算任意位数的正整数乘法
- setlocal enabledelayedexpansion
- if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
- if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
- set f=&set jia=&set ji=&set /a n1=0,n2=0
- set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
- for /l %%a in (0 1 9) do (
- set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
- for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
- for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
- if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
- for %%a in (!vard1!) do (set "t="&set /a j=0
- for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
- set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
- set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
- set "ji=!t:~-1!!ji!"
- if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
- set jia=!ss!!t:~0,-1!)
- if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
- set "ji=!t!!ji:~1!"
- Endlocal&set %~3=%ji%&goto :EOF
复制代码
作者: bobgjs 时间: 2010-7-14 12:42 标题: 回复 4楼 的帖子
长知识,这就是批处理之家,我们的家。
非常感谢neorobin耐心指点,我真是激动得很,手都快抖起来了,呵呵
给我解决了大问题。
作者: terse 时间: 2010-7-14 17:27
不用这么复杂吧 以前有贴 建议搜索
作者: neorobin 时间: 2010-7-14 18:13 标题: 回复 6楼 的帖子
在 cn-dos 有帖, netbenton 等人给出了更简洁的解
http://www.cn-dos.net/forum/viewthread.php?tid=45734
作者: Batcher 时间: 2010-7-14 19:25
移位比较简洁- @echo off
- >IP_out.txt cd.
- for /f "tokens=1,2,3" %%i in (ip.txt)do call:conv %%i&call:conv %%j&echo %%k >>IP_out.txt
- type IP_out.txt
- pause
- goto:EOF
- :conv
- for %%i in (24 16 8 0)do set/a ip%%i=%1^>^>%%i^&255
- set /p= %ip24%.%ip16%.%ip8%.%ip0% <nul >>IP_out.txt
复制代码
作者: neorobin 时间: 2010-7-14 19:31 标题: 回复 8楼 的帖子
楼主要的是 点分 4 段 十进制 转换为 十进制单一数
你这是所要求的逆过程
点分 4 段 十进制 转换为 十进制单一数
关键是第一段 在 127 以上时, set /a 计算范围已不满足, 故增加了复杂性
作者: terse 时间: 2010-7-15 03:25
补位的- @echo off&setlocal enabledelayedexpansion
- set "0=000000000"
- (
- for /f "tokens=1-8* delims=. " %%a in (ip.txt) do (
- if %%a gtr 127 (
- set /a "i=(%%a%%128<<24)+(%%b<<16)+(%%c<<8)+%%d"
- set i=!0!!i!
- set /a "n=1!i:~-9!%%1!0!+147483648,j=!i:~-10,1!+2"
- set n=!j!!n!
- ) else set /a "n=(%%a<<24)+(%%b<<16)+(%%c<<8)+%%d"
- if %%e gtr 127 (
- set /a "i=(%%e%%128<<24)+(%%f<<16)+(%%g<<8)+%%h"
- set i=!0!!i!
- set /a "m=1!i:~-9!%%1!0!+147483648,j=!i:~-10,1!+2"
- set m=!j!!m!
- ) else set /a "m=(%%e%%128<<24)+(%%f<<16)+(%%g<<8)+%%h"
- echo !n! !m! %%i
- )
- )>tem_ip.txt
- start "" "tem_ip.txt"
- pause
复制代码
作者: bobgjs 时间: 2010-7-27 08:59 标题: 回复 10楼 的帖子
这段代码干净利落,运行速度快,感谢,我将最终采纳。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |