中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决]10进制与16进制互转问题
作者:
标题: [已解决]10进制与16进制互转问题 上一主题 | 下一主题
suntb
高级用户





积分 581
发帖 277
注册 2006-12-23
状态 离线
『楼 主』:  [已解决]10进制与16进制互转问题 使用 LLM 解释/回答一下

具体情况如下:
因为要写一个注册某软件的批处理,需要将序列号(纯数字)转换为对应的16进制,经过系列换算后再将新的16进制数据再转回10进制
比如:

2319692668
转换成16进制后应该是
8a43b37c

反过来16进制的
8a43b37c
转换成10进制应该是
2319692668

但是我在CMD中用set /a 0x8a43b37c得到的结果却是
-1975274628

这是怎么回事?

Last edited by suntb on 2009-10-8 at 21:22 ]


2009-10-8 17:00
查看资料  发短消息  网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

因为批处理或cmd下,只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。
31个1换成十进制为2147483647,所以cmd下计算的有效值范围是 -2147483648 至 2147483647 。
你的数字大于这个数值范围,溢出了。。。。。。

Last edited by Hanyeguxing on 2009-10-8 at 17:56 ]




批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-10-8 17:48
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
suntb
高级用户





积分 581
发帖 277
注册 2006-12-23
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

Originally posted by Hanyeguxing at 2009-10-8 17:48:
因为批处理或cmd下,只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。
31个1换成十进制为2147483647, ...

谢谢 怎么解决?


2009-10-8 18:18
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

给个10转多进制的 支持大数
你逆算一下

@echo off&setlocal enabledelayedexpansion
set/p s=请输入十进制数:
set/p x=请输入转换进制:
set "str=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@"
:lp
set /a "n=8189,m=0,r=0"
for /l %%a in (1,1,14) do (
set /a "u=(n+m)/2"
for %%i in (!u!) do if "!s:~%%i!" equ "" (set /a n=u) else set /a m=u
)
for /l %%i in (0,1,%u%) do (
set/a "n=!s:~%%i,1!+(r*10),r=n%%x,n/=x"
set v=!v!!n!
)
set b=!str:~%r%,1!!b!
for /f "tokens=* delims=0" %%i in ("0!v!") do set "s=%%i"
if defined s set v=&goto lp
echo "!b!"
pause




简单!简单!再简单!
2009-10-8 20:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
suntb
高级用户





积分 581
发帖 277
注册 2006-12-23
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

Originally posted by terse at 2009-10-8 20:14:
给个10转多进制的 支持大数
你逆算一下

@echo off&setlocal enabledelayedexpansion
set/p s=请输入十进制数:
set/p x=请输入转换进制:
set "str=01234567 ...

非常感谢terse

经测试10进制转16进制没问题了

至于16进制转10进制我自己再琢磨一下

如果大家有好用的代码也可以贴上来帮忙下


2009-10-8 21:21
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

自己逆算一下 应该可以了吧




简单!简单!再简单!
2009-10-8 23:41
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

这不是件易事哦!
关键是溢出,要分段来做加法和乘法

16制(后7位+7位前的*268435456)

建议还是用三方吧

Last edited by netbenton on 2009-10-9 at 06:22 ]




精简
=> 个人网志
2009-10-9 08:16
查看资料  发送邮件  发短消息  网志  OICQ (37659560)  编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

发现变量int为空 最后显示空 修正下
另把补位的去掉 直接加

@echo off&setlocal enabledelayedexpansion
set s=8a43b37c
set /a "x=8189,m=0"
for /l %%a in (1,1,14) do (
set /a "l=(x+m)/2"
for %%i in (!l!) do if "!s:~%%i!" equ "" (set /a x=%%i) else set /a "m=%%i"
)
for /l %%i in (!l! -1 0) do (
set/a "i=0x!s:~%%i,1!,n=l-%%i"
if !n! lss 2 (
if defined in (set/a in+=16*i&if !in! gtr 99 (set rl=2)else set "rl=1"
for /l %%j in (0 1 !rl!) do set "ins=!in:~%%j,1!!ins!"
) else set/a "in=i"
) else (
set /a "i*=16"
if !i! gtr 99 (set lr=2)else set "lr=1"
for /l %%j in (0 1 !lr!) do set "inx=!i:~%%j,1!!inx!"
for /l %%a in (2 1 !n!) do (
for /l %%i in (0 1 !lr!) do (
set /a "m=6*!inx:~%%i,1!+r"
if !m! gtr 9 (set r=!m:~,1!) else set "r="
set "ni=!ni!!m:~-1!"
)
set ni=!ni!!r!&set in=!ni:~1!&set nj=!nj!!ni:~,1!&set "r="
for /l %%i in (0 1 !lr!) do (
set/a "m=!in:~%%i,1!+!inx:~%%i,1!+r"
if !m! gtr 9 (set r=1) else set "r="
set "nx=!nx!!m:~-1!"
)
set inx=!nj!!nx!!r!&set nj=&set ni=&set "nx="
if !m! lss 10 (set /a lr+=1)else set r=&set /a lr+=2
)
if !rl! lss !lr! set/a "rl=lr"
for /l %%i in (0 1 !rl!) do (
set/a "m=!inx:~%%i,1!+!ins:~%%i,1!+r"
if !m! gtr 9 (set r=1) else set "r="
set "ni=!ni!!m:~-1!"
)
if defined r set/a rl+=1&set ni=!ni!!r!&set "r="
set ins=!ni!&set ni=&set "inx="
)
)
if defined ins set in=&for /l %%i in (0 1 !rl!) do set "in=!ins:~%%i,1!!in!"
echo !in!&pause


Last edited by terse on 2009-10-10 at 23:02 ]


   此帖被 +11 点积分        点击查看详情   
评分人:【 netbenton 分数: +11  时间:2009-10-10 18:51




简单!简单!再简单!
2009-10-9 23:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
suntb
高级用户





积分 581
发帖 277
注册 2006-12-23
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

Originally posted by terse at 2009-10-9 23:14:

@echo off&setlocal enabledelayedexpansion
set s=8a43b37c
set /a ix=16
set /a "x=8189,m=0"
for /l %%a in (1,1,14) do (
set /a "l=(x+m)/2"
for %% ...


非常感谢 测试通过


2009-10-10 16:19
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: