[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [分享]批处理大数的自由进制转换

本帖最后由 qzwqzw 于 2012-6-4 18:39 编辑

由于某一个加解密算法的需要
需要对一串数字进行特殊进制的转换
此前类似的进制转换算法应该已经不少
就是不知道是否可以支持大数(>2^31)
所以参考了网上的一些资料
设计了一个大数的自由进制转换算法
%进制数列%限制了自由进制的支持上限
  1. @echo off & setlocal EnableDelayedExpansion
  2. set 大数=111111111111111111111111111111
  3. set from=2
  4. set to=10
  5. call :XConvert %大数% %from% %to% 结果
  6. echo [%from%进制] %大数%
  7. echo [%to%进制] %结果%
  8. pause
  9. goto :eof
  10. :XConvert - X进制大数N转换为指定Y进制(X/Y不大于62)
  11. :: 参考链接:http://www.cppblog.com/baby-fly/archive/2009/10/24/99362.html
  12. ::           http://www.cnblogs.com/phinecos/archive/2009/09/11/1564975.html
  13. setlocal EnableDelayedExpansion
  14. set 源数=%~1
  15. set 源进制=%~2
  16. set 目标进制=%~3
  17. set 返回值=%~4
  18. set 进制数列=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
  19. :XCloop1
  20. set 位号=0
  21. set 模=0
  22. set 商=
  23. :XCloop2
  24. set 当前位=!源数:~%位号%,1!
  25. set 当前位值=-1
  26. :XCLoop3
  27. set /a 当前位值+=1
  28. if not "%当前位%"=="!进制数列:~%当前位值%,1!" goto :XCLoop3
  29. set /a 当前除数=模 * 源进制 + 当前位值
  30. set /a 当前商=当前除数 / 目标进制
  31. set 商=%商%!进制数列:~%当前商%,1!
  32. if "%商%"=="0" set 商=
  33. set /a 模=当前除数 %% 目标进制
  34. set /a 位号+=1
  35. if not "!源数:~%位号%,1!"=="" goto :XCloop2
  36. if "%商%"=="" set 商=0
  37. set 目标数=!进制数列:~%模%,1!%目标数%
  38. set 源数=%商%
  39. if not "%源数%"=="0" goto :XCloop1
  40. endlocal & set %返回值%=%目标数%
  41. goto :eof
复制代码
1

评分人数

天的白色影子

回复 3# terse

在大数相除的算法上
你我都是模拟人工算法
只是我的算法多了源进制的变换

但是你的for实现
比我的goto loop实现高效的多
这可以归功与理论结合实践吧

另外上次贴出的代码存在两个严重问题
看来大家都没发现悄悄改了
天的白色影子

TOP

返回列表