Board logo

标题: [文本处理] [已解决]批处理怎样把点分十进制的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,在这段代码中需要怎么改进?
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for /f "delims=" %%l in (ip.txt) do (
  4.   set "cnt=0"
  5.   for %%i in (%%l) do (
  6.     set /a cnt+=1
  7.     if !cnt! leq 2 (
  8.       set tt=%%i
  9.       REM set /a (((222)*256+248)*256+240)*256+1 这种形式的结果将超出批处理计算范围, 故不可用
  10.       set "sum=0"
  11.       for %%t in (!tt:.^= !) do (
  12.         call :cen !sum! 256 sum
  13.         call :jia !sum! %%t sum
  14.       )
  15.       set /p=!sum! <nul
  16.     ) else set /p= %%i<nul
  17.   )
  18.   echo.
  19. )
  20. pause
  21. exit /b
  22. :jia 加法函数(封装)by @随风 @bbs.bathome.net
  23. ::计算任意位数的正整数加法
  24. setlocal enabledelayedexpansion&set f=&set "t="
  25. set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
  26. for /l %%a in (0 1 9) do (set vard1=&set "vard2="
  27. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  28. for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
  29. for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
  30. (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
  31. set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
  32. for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
  33. set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
  34. set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
  35. if !j! neq 0 set "t=!j!!t!"
  36. Endlocal&set %~3=%t%&goto :EOF
  37. :cen 乘法函数(封装)by @随风 @bbs.bathome.net
  38. ::计算任意位数的正整数乘法
  39. setlocal enabledelayedexpansion
  40. if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
  41. if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
  42. set f=&set jia=&set ji=&set /a n1=0,n2=0
  43. set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
  44. for /l %%a in (0 1 9) do (
  45. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  46. for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
  47. for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
  48. if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
  49. for %%a in (!vard1!) do (set "t="&set /a j=0
  50. for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
  51. set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
  52. set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
  53. set "ji=!t:~-1!!ji!"
  54. if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
  55. set jia=!ss!!t:~0,-1!)
  56. if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
  57. set "ji=!t!!ji:~1!"
  58. Endlocal&set %~3=%ji%&goto :EOF
复制代码


[ 本帖最后由 bobgjs 于 2010-7-20 12:55 编辑 ]
作者: CUer    时间: 2010-7-13 23:07

  1. 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

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for /f "delims=" %%l in (ip.txt) do (
  4.   set "cnt=0"
  5.   for %%i in (%%l) do (
  6.     set /a cnt+=1
  7.     if !cnt! leq 2 (
  8.       set tt=%%i
  9.       REM set /a (((222)*256+248)*256+240)*256+1 这种形式的结果将超出批处理计算范围, 故不可用
  10.       set "sum=0"
  11.       for %%t in (!tt:.^= !) do (
  12.         call :cen !sum! 256 sum
  13.         call :jia !sum! %%t sum
  14.       )
  15.       set /p=!sum! <nul
  16.     ) else set /p= %%i<nul
  17.   )
  18.   echo.
  19. )
  20. pause
  21. exit /b
  22. :jia 加法函数(封装)by @随风 @bbs.bathome.net
  23. ::计算任意位数的正整数加法
  24. setlocal enabledelayedexpansion&set f=&set "t="
  25. set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
  26. for /l %%a in (0 1 9) do (set vard1=&set "vard2="
  27. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  28. for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
  29. for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
  30. (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
  31. set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
  32. for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
  33. set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
  34. set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
  35. if !j! neq 0 set "t=!j!!t!"
  36. Endlocal&set %~3=%t%&goto :EOF
  37. :cen 乘法函数(封装)by @随风 @bbs.bathome.net
  38. ::计算任意位数的正整数乘法
  39. setlocal enabledelayedexpansion
  40. if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
  41. if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
  42. set f=&set jia=&set ji=&set /a n1=0,n2=0
  43. set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
  44. for /l %%a in (0 1 9) do (
  45. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  46. for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
  47. for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
  48. if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
  49. for %%a in (!vard1!) do (set "t="&set /a j=0
  50. for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
  51. set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
  52. set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
  53. set "ji=!t:~-1!!ji!"
  54. if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
  55. set jia=!ss!!t:~0,-1!)
  56. if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
  57. set "ji=!t!!ji:~1!"
  58. Endlocal&set %~3=%ji%&goto :EOF
复制代码

[ 本帖最后由 neorobin 于 2010-7-14 00:12 编辑 ]
作者: neorobin    时间: 2010-7-14 12:36     标题: 再回楼主

稍作修改即可 输出 到文件, 将原来的关键输出代码 全部 括起, 如下重新安排
  1. >ip2.txt (
  2.   关键输出代码部分
  3. )
复制代码
做好后便是
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. >ip2.txt (
  4. for /f "delims=" %%l in (ip.txt) do (
  5. set "cnt=0"
  6. for %%i in (%%l) do (
  7. set /a cnt+=1
  8. if !cnt! leq 2 (
  9. set tt=%%i
  10. REM set /a (((222)*256+248)*256+240)*256+1 这种形式的结果将超出批处理计算范围, 故不可用
  11. set "sum=0"
  12. for %%t in (!tt:.^= !) do (
  13. call :cen !sum! 256 sum
  14. call :jia !sum! %%t sum
  15. )
  16. set /p=!sum! <nul
  17. ) else set /p= %%i<nul
  18. )
  19. echo.
  20. )
  21. )
  22. start ip2.txt
  23. pause
  24. exit /b
  25. :jia 加法函数(封装)by @随风 @bbs.bathome.net
  26. ::计算任意位数的正整数加法
  27. setlocal enabledelayedexpansion&set f=&set "t="
  28. set var1=%~1&set var2=%~2&set /a j=0,n1=0,n2=0
  29. for /l %%a in (0 1 9) do (set vard1=&set "vard2="
  30. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  31. for %%a in (!var1!)do (set/a n1+=1&set vard1=%%a !vard1!)
  32. for %%a in (!var2!)do (set/a n2+=1&set vard2=%%a !vard2!)
  33. (if !n1! lss !n2! (set var1=%var2%&set "var2=%var1%"
  34. set vard1=%vard2%&set vard2=%vard1%))&set "var2=!var2: =!"
  35. for %%a in (!vard1!) do (if "!var2!"=="" set /a var2=0
  36. set /a a=%%a+!var2:~-1!+j&set t=!a:~-1!!t!&set "a=0!a!"
  37. set "j=!a:~-2,1!"&set var2=!var2:~0,-1!)
  38. if !j! neq 0 set "t=!j!!t!"
  39. Endlocal&set %~3=%t%&goto :EOF
  40. :cen 乘法函数(封装)by @随风 @bbs.bathome.net
  41. ::计算任意位数的正整数乘法
  42. setlocal enabledelayedexpansion
  43. if "%~1"=="0" Endlocal&set %~3=0&goto :EOF
  44. if "%~2"=="0" Endlocal&set %~3=0&goto :EOF
  45. set f=&set jia=&set ji=&set /a n1=0,n2=0
  46. set vard1=&set "vard2="&set var1=%~1&set "var2=%~2"
  47. for /l %%a in (0 1 9) do (
  48. set var1=!var1:%%a= %%a !&set var2=!var2:%%a= %%a !)
  49. for %%a in (!var1!)do (set /a n1+=1&set vard1=%%a !vard1!)
  50. for %%a in (!var2!)do (set /a n2+=1&set vard2=%%a !vard2!)
  51. if !n1! gtr !n2! (set vard1=%vard2%&set vard2=%vard1%)
  52. for %%a in (!vard1!) do (set "t="&set /a j=0
  53. for %%b in (!vard2!) do (if "!jia!"=="" set /a jia=0
  54. set /a a=%%a*%%b+j+!jia:~-1!&set "t=!a:~-1!!t!"
  55. set a=0!a!&set "j=!a:~-2,1!"&set jia=!jia:~0,-1!)
  56. set "ji=!t:~-1!!ji!"
  57. if "!j:~0,1!"=="0" (set ss=) else set "ss=!j:~0,1!"
  58. set jia=!ss!!t:~0,-1!)
  59. if not "!j:~0,1!"=="0" set "t=!j:~0,1!!t!"
  60. set "ji=!t!!ji:~1!"
  61. 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

移位比较简洁
  1. @echo off
  2. >IP_out.txt cd.
  3. for /f "tokens=1,2,3" %%i in (ip.txt)do call:conv %%i&call:conv %%j&echo    %%k >>IP_out.txt
  4. type IP_out.txt
  5. pause
  6. goto:EOF
  7. :conv
  8. for %%i in (24 16 8 0)do set/a ip%%i=%1^>^>%%i^&255
  9. 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

补位的
  1. @echo off&setlocal enabledelayedexpansion
  2. set "0=000000000"
  3.   (
  4.     for /f "tokens=1-8* delims=. " %%a in (ip.txt) do (
  5.         if %%a gtr 127 (
  6.            set /a "i=(%%a%%128<<24)+(%%b<<16)+(%%c<<8)+%%d"
  7.            set i=!0!!i!
  8.            set /a "n=1!i:~-9!%%1!0!+147483648,j=!i:~-10,1!+2"
  9.            set n=!j!!n!
  10.         ) else set /a "n=(%%a<<24)+(%%b<<16)+(%%c<<8)+%%d"
  11.              if %%e gtr 127 (
  12.                 set /a "i=(%%e%%128<<24)+(%%f<<16)+(%%g<<8)+%%h"
  13.                 set i=!0!!i!
  14.                 set /a "m=1!i:~-9!%%1!0!+147483648,j=!i:~-10,1!+2"
  15.                 set m=!j!!m!
  16.              ) else set /a "m=(%%e%%128<<24)+(%%f<<16)+(%%g<<8)+%%h"
  17.                 echo !n! !m! %%i
  18.     )
  19.   )>tem_ip.txt
  20. start "" "tem_ip.txt"
  21. pause
复制代码

作者: bobgjs    时间: 2010-7-27 08:59     标题: 回复 10楼 的帖子

这段代码干净利落,运行速度快,感谢,我将最终采纳。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2