中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-09-30 13:07
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结][超级感谢netbenton和其他老师的帮助]IP类型转换 查看 3,104 回复 29
第 16 楼 发表于 2009-01-04 11:02 ·  中国 浙江 嘉兴 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
不错不错,这个算法精简多了
建议右边部分取9位,这样尽量减少算法使用的时间
第 17 楼 看看这段如何?? 发表于 2009-01-04 14:09 ·  中国 湖北 武汉 电信
初级用户
★
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
@echo off&setlocal enabledelayedexpansion
set hex=0123456789ABCDEF
for /f "usebackq tokens=1,2*" %%i in ("ip.txt") do (
if not "%%i"=="" set var=&set h=&set s=%%i&call:lp
set/a ha=0x!var:~-8,2!,hb=0x!var:~-6,2!,hc=0x!var:~-4,2!,hd=0x!var:~-2,2!
set str1=!ha!.!hb!.!hc!.!hd!
if not "%%j"=="" set var=&set h=&set s=%%j&call:lp
set/a ha=0x!var:~-8,2!,hb=0x!var:~-6,2!,hc=0x!var:~-4,2!,hd=0x!var:~-2,2!
set str2=!ha!.!hb!.!hc!.!hd!
>>ip1.txt echo !str1! !str2! %%k
)
start "" "ip1.txt"
pause&goto :eof
:lp
set/a m=s/16,n=s%%16
set n=!hex:~%n%,1!
set h=%n%%h%
if %m% geq 16 set s=%m%&goto lp
set m=!hex:~%m%,1!
set var=0%m%%h%


看看 这样会不会 有什么问题呢?

[ Last edited by cz1314 on 2009-1-4 at 14:12 ]
第 18 楼 Re 17楼 发表于 2009-01-04 14:48 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
有没有问题,你自己测试一下不就知道了么?
第 19 楼 发表于 2009-01-05 14:47 ·  中国 贵州 安顺 电信
初级用户
★
积分 94
发帖 49
注册 2008-12-14 20:47
17年会员
UID 133884
性别 男
状态 离线
我也来练习一下,
@echo off
for /f "tokens=1,2,3" %%i in (test.txt) do call :conv %%i&call :conv %%j&echo %%k
goto :EOF
:conv
set/a ip=%1,ip1_=0
if %ip% lss 0 set/a ip=ip+2147483647+1,ip1_+=128
set/a ip1=ip/16777216,ip-=ip1*16777216,ip1+=ip1_
set/a ip2=ip/65536,ip-=ip2*65536
set/a ip3=ip/256,ip-=ip3*256
set /p =IP,%1 %ip1%.%ip2%.%ip3%.%ip% <nul
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
netbenton +2 2009-01-06 02:07
第 20 楼 发表于 2009-01-06 02:07 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
哇,厉害!
精简
=> 个人网志
第 21 楼 发表于 2009-01-06 12:05 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
21年会员
UID 42345
状态 离线
19楼上改进

@echo off&setlocal enabledelayedexpansion
cd.>ip1.txt
for /f "tokens=1,2,3" %%i in (ip.txt) do (
set n=0
call:lp %%i %%j
>>ip1.txt echo !str1! !str2! %%k
)
pause&goto :eof
:lp
set/a ip=%1,n+=1
if %ip% lss 0 (set/a ip-=2147483648,_ip=128)else set _ip=0
set/a ip1=ip/16777216,ip2=ip%%16777216/65536,ip3=ip%%65536/256,ip4=ip%%256,ip1+=_ip
set "str%n%=%ip1%.%ip2%.%ip3%.%ip4%"
if not "%2" == "" call:lp %2
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
netbenton +2 2009-01-07 02:51
简单!简单!再简单!
第 22 楼 发表于 2009-01-06 20:57 ·  中国 贵州 安顺 电信
初级用户
★
积分 94
发帖 49
注册 2008-12-14 20:47
17年会员
UID 133884
性别 男
状态 离线
位移版,似乎更简单点
@echo off
for /f "tokens=1,2,3" %%i in (test.txt)do call:conv %%i&call:conv %%j&echo %%k
goto:EOF
:conv
for %%i in (24 16 8 0)do set/a ip%%i=%1^>^>%%i^&255
set /p=IP,%1 %ip24%.%ip16%.%ip8%.%ip0% <nul


[ Last edited by linee on 2009-1-6 at 21:06 ]
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
netbenton +2 2009-01-07 02:52
everest79 +15 2009-01-08 06:29
第 23 楼 发表于 2009-01-07 02:53 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
22楼的应该是绝版了
偶学习了

[ Last edited by netbenton on 2009-1-7 at 02:54 ]
精简
=> 个人网志
第 24 楼 发表于 2009-01-08 00:34 ·  中国 湖北 武汉 电信
初级用户
★
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
22 楼 好象没有输出大批文本啊。。。
第 25 楼 根据22楼的稍作改动,这样就合要求了 发表于 2009-01-08 01:06 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
@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

[ Last edited by netbenton on 2009-1-8 at 01:12 ]
精简
=> 个人网志
第 26 楼 发表于 2009-01-15 21:27 ·  中国 北京 中国科学院研究生院玉泉四公寓
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
Originally posted by netbenton at 2009-1-8 01:06:
@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 ...



22# 25# 似乎都对超过4294967295 的数字不能转换了.

这是32bit机器上的上限.
第 27 楼 发表于 2009-01-15 21:30 ·  中国 北京 中国科学院研究生院玉泉四公寓
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
并且, 对于超出范围的数据,比如:

50331648 1033418400 US
4000000001 50332671 US
3549476416 50332927 US
4000000000 50333695 US
4007483643 50333951 US
11111111111 11111111110 cn
2123369536 50334719 US
4294967295 4294967294 us
11111111111 11111111110 cn


输出结果会取用上一个有效数据的值.
第 28 楼 发表于 2009-01-15 22:31 ·  中国 广东 深圳 宝安区 电信
初级用户
★★
游手好闲 + 无所事事 ..
积分 194
发帖 167
注册 2007-04-30 09:43
19年会员
UID 87022
性别 男
状态 离线
牛人啊!顶一个,最近几天忙着培训,没时间来学习了,呵呵。
第 29 楼 发表于 2009-01-16 00:30 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
超过32位的可以分成两截来处理,如15楼的方法,
只是不知道超过32位的ip地址有什么用?


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
2.150.70.25.199 2.150.70.25.198 cn
126.144.12.64 3.0.11.255 US
255.255.255.255 255.255.255.254 us
2.150.70.25.199 2.150.70.25.198 cn
精简
=> 个人网志
第 30 楼 发表于 2009-01-16 01:37 ·  中国 湖北 武汉 电信
初级用户
★
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
netbenton


非常感谢!也感谢所有老师的帮助!
论坛跳转: