中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-23 02:15
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结][超级感谢netbenton和其他老师的帮助]IP类型转换 查看 2,664 回复 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
20年会员
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


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