找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1952|回复: 10

[数值计算] 十进制数据在2-36 进制间转换.BAT

[复制链接]
发表于 2025-10-25 23:11:12 | 显示全部楼层 |阅读模式
如题:十进制数据在2-36 进制间转换!
借助JS 脚本的 toString 函数写的!
以前的写法很生硬,,
是直接,,,,
Echo.WSH.Echo(Number(%数据%).toString(%进制%))>date_to_hexx
写成,,,,
然后运行完成后 再 DEL date_to_hexx
最近几天无聊,翻看以前写的脚本  ,有点疑惑,
于是求助http://www.bathome.net/thread-71229-1-1.html
得知
JS脚本获取外部启动参数 WSH.Arguments(0)
有获得 JS 删除自身 的写法 WSH.createobject("scripting.filesystemobject").deletefile(WSH.scriptfullname)
于是改写了以前无聊时写下的脚本,,,
感觉这样写法,,,顺眼多了,,,
  1. @Echo off
  2. Set /p date=请输入需要转换的数值(十进制):
  3. Set /p hexx=请输入转换的进制(2-36):
  4. Echo.%date%|FindStr "^[0-9]*$">Nul || Echo.数据非法输入!按任意键退出!&& Pause > Nul && Exit
  5. Echo.%hexx%|FindStr "^[0-9]*$">Nul || Echo.进制非法输入!按任意键退出!&& Pause > Nul && Exit
  6. if %hexx% lss 2 Echo.进制小于 2  !按任意键退出!& Pause>Nul & Exit
  7. if %hexx% gtr 36 Echo.进制大于 36 !按任意键退出!& Pause>Nul & Exit
  8. Echo.WSH.Echo(Number(WSH.Arguments(0)).toString(WSH.Arguments(1)))>date_to_hexx
  9. Echo.WSH.createobject("scripting.filesystemobject").deletefile(WSH.scriptfullname)>>date_to_hexx
  10. For /f %%a in ('cscript -nologo -e:jscript "date_to_hexx" %date% %hexx%') do ( Echo.数据 【%date%】 转换成 【%hexx%】 进制,得出【%%a】)
  11. Pause>Nul & Exit
复制代码
发表于 2025-10-26 00:25:05 | 显示全部楼层
回复 1# jiavip

以下代码采用 bat+jscript 混编,存为 test.bat 运行,不必创建临时文件,同时给出检查输入(set/p)有效性的一些纯P解决方案,仅供参考...

  1. 2>1/* ::
  2. @echo off
  3. :loop1
  4. set "d=" &set "_d=" & set /p d=请输入需要转换的数值(十进制):
  5. if not defined d exit/b
  6. for /f "delims=0123456789" %%d in ("%d%") do set "_d=1"
  7. if defined _d goto loop1
  8. :loop2
  9. set "h=" & set /p h=请输入转换的进制(2-36):
  10. if not defined h exit/b
  11. if %h% lss 2 (goto loop2) else if %h% gtr 36 goto loop2
  12. for /f %%a in ('cscript -nologo -e:jscript "%~f0" %d% %h%') do (echo,数据【%d%】转换成【%h%】进制,得出【%%a】)
  13. pause&exit/b
  14. */
  15. WSH.echo(number(WSH.arguments(0)).toString(WSH.arguments(1))); WSH.quit()
复制代码
 楼主| 发表于 2025-10-26 00:55:29 | 显示全部楼层
回复 2# aloha20200628

不怎么喜欢混编,因为要放进自己的批处理工具箱,混编虽然是一种写法,但是局限性太多,
发表于 2025-10-26 09:13:08 | 显示全部楼层
del 很生硬
deletefile 顺眼多了
这件事情的底层逻辑是什么
虽不懂,但尊重
发表于 2025-10-26 09:14:28 | 显示全部楼层
回复 3# jiavip


    局限性的例子能否分享几个?我也想学习,太想进步了
 楼主| 发表于 2025-10-26 10:15:45 | 显示全部楼层
回复 4# ShowCode

很简单啊 DEL 是在执行完后另外写命令才删除,还要写路径和脚本名。
而 deletefile 在调用的同时顺手自删,省去写路径和脚本名,如果路径有空格或奇奇怪怪的畸形路径会很费事。
,,,
,,,,
,,,,,
混编说过了,如果选择混编,那样扔进 批处理工具箱 会不适用。
生成临时文件写法,只要创建标签 就可以直接 Goto 就可以调用了。,,,,,,,,,,,
 楼主| 发表于 2025-11-2 01:43:19 | 显示全部楼层
本帖最后由 jiavip 于 2025-11-2 02:47 编辑

回复 4# ShowCode


    补充一下吧!,,脚本自删,或程序自删,是很有必要的存在!
接触(程序&脚本)打包运行多了,就会发现,很多自解压程序,它们生成的自解压路径,不是固定的,会根据不同的系统版本,不同的系统path变量,在变化而变化!
哪怕是,自解压程序包,它们生成的路径,有些都是临时生成,有排序规则的。
自删命令,,,可以说是为了这些场景而产生的。适应更多系统版本,适应更多自定义path变量,,,
,,
,,,
,,,,
这样解释,希望你们能悟到一些什么!,,
————————再补充——
以前,我就做过很多个系统盘不是C盘,而C盘却设置成临时目录&系统回收站&虚拟内存的私人win系统!,,
这样设置的系统,有一个好玩的情况!有一些个比较笨或比较傻的程序和脚本,会按照,常规死的路径,把程序&脚本,全部释放到我设置的空白临时C盘里去运行,,,
————————再,再补充——
玩过PE系统吗?,,
玩过win PE系统的,都知道,系统盘绝对不是C盘,而临时文件夹和path路径,或其他盘符,也会尽力避开原有盘符,,
脚本的写法可以有很多,,,,
墨守成规的写法,一般叫死写法!喜欢这样写的一般很难突破局限和组合,,
灵活变通的写法,一般叫混合法!在已知的系统框架和语言支持下物尽其用,各种调用,各种混合。
另外一种呢!,,叫创新法,也叫创世法!,这样的人,一般都是编程大牛,它们会从硬件的底层运行和通讯,利用现有框架,造码,制造出适合自己生存的环境,然后再运行!,,,例如,当年写BIOS病毒,和硬盘逻辑锁,还有磁盘分区表病毒,,的那类人,,
发表于 2025-12-3 18:52:01 | 显示全部楼层
10转2-36没怎么琢磨过,但是10转16有一个小技巧,适用范围等效于一个32位带符号整型,可被set /a准确的转回去
  1. :decToHex
  2. set /a "dec=%~1" 2>nul

  3. cmd /c exit /b %dec% 1>nul 2>&1
  4. set "result=%=ExitCode%"

  5. if "%~2" neq "formatted" goto :eof

  6. if %dec% lss 0 goto :eof

  7. if %dec% lss 16 (set "result=%result:~7%" && goto :eof)
  8. if %dec% lss 256 (set "result=%result:~6%" && goto :eof)
  9. if %dec% lss 4096 (set "result=%result:~5%" && goto :eof)
  10. if %dec% lss 65536 (set "result=%result:~4%" && goto :eof)
  11. if %dec% lss 1048576 (set "result=%result:~3%" && goto :eof)
  12. if %dec% lss 16777216 (set "result=%result:~2%" && goto :eof)
  13. if %dec% lss 268435456 (set "result=%result:~1%" && goto :eof)

  14. goto :eof
复制代码
发表于 2025-12-3 19:33:46 | 显示全部楼层
本帖最后由 RENaa_FD 于 2025-12-4 19:12 编辑

本来向着自己在cmd实现原生的2-36进制转换,向着试试问问ai,但没想到ai出乎我意料的给出了完整的正确实现
顺便补充:这个实现与我之前给的10转16的行为差异是其对负数的处理是直接添加负号,而不是补码表示,至于哪个更好就得看使用场景了,有效的数字范围都是一样的
  1. @echo off
  2. setlocal EnableDelayedExpansion

  3. :: ============================================================================
  4. :: 测试用例
  5. :: ============================================================================
  6. echo --- 十进制转任意进制测试 (2-36) ---
  7. echo.

  8. call :testOutput "10转2进制: " 10 2
  9. call :testOutput "255转16进制: " 255 16
  10. call :testOutput "255转8进制: " 255 8
  11. call :testOutput "1024转16进制: " 1024 16
  12. call :testOutput "1000转36进制: " 1000 36
  13. call :testOutput "35转36进制: " 35 36

  14. echo.
  15. echo --- 负数测试 ---

  16. call :testOutput "-10转2进制: " -10 2
  17. call :testOutput "-255转16进制: " -255 16
  18. call :testOutput "-1000转8进制: " -1000 8
  19. call :testOutput "-35转36进制: " -35 36

  20. echo.
  21. echo 按任意键退出...
  22. pause >nul

  23. :: 跳转到文件末尾
  24. goto :eof

  25. :: ============================================================================
  26. :: 子程序:测试输出
  27. :: 用法: call :testOutput "标签文本" 数值 进制
  28. :: ============================================================================
  29. :testOutput
  30. set "LABEL=%~1"
  31. call :decToAny %~2 %~3
  32. echo %LABEL%!RESULT!
  33. goto :eof

  34. :: ============================================================================
  35. :: 子程序:十进制转任意进制 (2-36)
  36. :: 功能: 计算结果存入RESULT变量
  37. :: 用法: call :decToAny 十进制数 目标进制
  38. :: ============================================================================
  39. :decToAny
  40. set "DEC=%~1"
  41. set "BASE=%~2"
  42. set "DIGITS=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  43. set "RESULT="

  44. REM 验证输入
  45. if not defined BASE set "BASE=16"
  46. set /a "BASETMP=10*BASE" 2>nul || (
  47.     set "RESULT=错误:无效的进制 '%~2'"
  48.     goto :eof
  49. )
  50. if %BASE% lss 2 (
  51.     set "RESULT=错误:进制必须≥2"
  52.     goto :eof
  53. )
  54. if %BASE% gtr 36 (
  55.     set "RESULT=错误:进制必须≤36"
  56.     goto :eof
  57. )

  58. REM 处理零
  59. if "%DEC%"=="0" (
  60.     set "RESULT=0"
  61.     goto :eof
  62. )

  63. REM 处理负数
  64. set "SIGN="
  65. if "%DEC:~0,1%"=="-" (
  66.     set "SIGN=-"
  67.     set "DEC=%DEC:~1%"
  68. )

  69. REM 核心转换算法
  70. set "N=%DEC%"
  71. :loop
  72. if "%N%"=="0" goto :done

  73. REM 计算余数和商
  74. set /a "REM=N %% BASE, N=N / BASE"

  75. REM 如果余数为负,调整为正数并补偿商
  76. if !REM! lss 0 (
  77.     set /a "REM=REM + BASE, N=N - 1"
  78. )

  79. for %%i in (!REM!) do set "RESULT=!DIGITS:~%%i,1!!RESULT!"
  80. goto :loop

  81. :done
  82. if not defined RESULT set "RESULT=0"
  83. if defined SIGN set "RESULT=%SIGN%%RESULT%"
  84. goto :eof
复制代码
发表于 2025-12-3 20:30:32 | 显示全部楼层
第一反应是丢给AI写 —— 脑子越来越钝了。
发表于 2025-12-3 20:30:35 | 显示全部楼层
第一反应是丢给AI写 —— 脑子越来越钝了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:10 , Processed in 0.020553 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表