本帖最后由 qzwqzw 于 2012-6-4 18:39 编辑
由于某一个加解密算法的需要
需要对一串数字进行特殊进制的转换
此前类似的进制转换算法应该已经不少
就是不知道是否可以支持大数(>2^31)
所以参考了网上的一些资料
设计了一个大数的自由进制转换算法
%进制数列%限制了自由进制的支持上限- @echo off & setlocal EnableDelayedExpansion
- set 大数=111111111111111111111111111111
- set from=2
- set to=10
- call :XConvert %大数% %from% %to% 结果
- echo [%from%进制] %大数%
- echo [%to%进制] %结果%
- pause
- goto :eof
-
- :XConvert - X进制大数N转换为指定Y进制(X/Y不大于62)
- :: 参考链接:http://www.cppblog.com/baby-fly/archive/2009/10/24/99362.html
- :: http://www.cnblogs.com/phinecos/archive/2009/09/11/1564975.html
- setlocal EnableDelayedExpansion
- set 源数=%~1
- set 源进制=%~2
- set 目标进制=%~3
- set 返回值=%~4
- set 进制数列=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
- :XCloop1
- set 位号=0
- set 模=0
- set 商=
- :XCloop2
- set 当前位=!源数:~%位号%,1!
- set 当前位值=-1
- :XCLoop3
- set /a 当前位值+=1
- if not "%当前位%"=="!进制数列:~%当前位值%,1!" goto :XCLoop3
- set /a 当前除数=模 * 源进制 + 当前位值
- set /a 当前商=当前除数 / 目标进制
- set 商=%商%!进制数列:~%当前商%,1!
- if "%商%"=="0" set 商=
- set /a 模=当前除数 %% 目标进制
- set /a 位号+=1
- if not "!源数:~%位号%,1!"=="" goto :XCloop2
- if "%商%"=="" set 商=0
- set 目标数=!进制数列:~%模%,1!%目标数%
- set 源数=%商%
- if not "%源数%"=="0" goto :XCloop1
- endlocal & set %返回值%=%目标数%
- goto :eof
复制代码
|