Batch file 十进制到十六进制&;二进制转换器批处理程序,有什么建议如何不同地实现它?

Batch file 十进制到十六进制&;二进制转换器批处理程序,有什么建议如何不同地实现它?,batch-file,Batch File,我一直在研究十进制到十六进制和二进制的转换,十六进制将十进制数转换成十六进制,二进制转换完成了它的工作 这很好,但是有没有其他方法来实现这段代码 @echo off setlocal EnableDelayedExpansion :Main setlocal cls set /p decIn=enter Decimal value: call :DectoHex %decIn% hexOut call :DectoBin %decIn% binOut echo !hexOut! echo !

我一直在研究十进制到十六进制和二进制的转换,十六进制将十进制数转换成十六进制,二进制转换完成了它的工作

这很好,但是有没有其他方法来实现这段代码

@echo off
setlocal EnableDelayedExpansion

:Main
setlocal
cls
set /p decIn=enter Decimal value: 
call :DectoHex %decIn% hexOut
call :DectoBin %decIn% binOut
echo !hexOut!
echo !binOut!
pause>nul
goto :main
endlocal

::-------------------------------------------------------------------------------------

:DectoHex
set /a A=%1
set map=0123456789ABCDEF
set H=

:Hexloop
set /a B=!A! %%16 & set /a A /=16 
set H=!map:~%B%,1!!H!
if !A! gtr 0 goto :Hexloop
set %2=!H!
goto :eof

::-------------------------------------------------------------------------------

:DectoBin
:: Note Dec Bit Bin (DBB)

set /a Dec=%1
set Bin=
for /L %%i in (1,1,32) do (
    set /a "Bit=Dec&1, Dec>>=1"
    set Bin=!Bit!!Bin!
)


:skimming
    if %Bin:~0,1% == 0 (
    set Bin=%Bin:~1% & goto :skimming

)

set %2=!Bin!
goto :eof

::-----------------------------------------------------------------------------

:BintoDec
set bin=11011
set dig=
set digval=1

set dec=

:Loop
if %bin% gtr 1 (
    set dig=%bin:~-1%
    set bin=%bin:~0,-1%
) else (
    set /a dig=%bin%
    set bin=0
)

if %dig% equ 1 (
    set /a dec+=%digval%
)
set digval *=2

if %bin% gtr 0 goto :loop

echo %dec%

pause>nul

goto :eof

主功能接收来自用户的输入,并将变量作为参数传递给十六进制转换器和二进制转换器,

转换为2到36之间的任意基数:

:: Q:\Test\2017\09\16\SO_46254352.cmd
@echo off & setlocal EnableDelayedExpansion
set map=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

:Main
cls
set "DecIn="
set /p DecIn=enter value: 
if not defined DecIn goto :Eof
Set /A DecIn=DecIn

call :Dec2Base  2 %DecIn%  BaseOut
call :Base2Dec  2 %BaseOut% DecBack
echo DecBack=%DecBack%  Base  2=%BaseOut%

call :Dec2Base 16 %DecIn%  BaseOut
call :Base2Dec 16 %BaseOut% DecBack
echo DecBack=%DecBack%  Base 16=%BaseOut%

call :Dec2Base 32 %DecIn%  BaseOut
call :Base2Dec 32 %BaseOut% DecBack
echo DecBack=%DecBack%  Base 32=%BaseOut%

goto :main
::-------------------------------------------------------------------------------------
:Dec2Base Base DecIn BaseOut
Setlocal
Echo:%2|findstr /i "^[%map:~0,10%]*$" >Nul 2>&1 ||(Echo invalid char for base 10&Goto :Eof)
set /a Num=%2
set "Ret="

:Dec2BaseLoop
set /a "Digit=Num %% %1"
set /a "Num /= %1"
set Ret=!map:~%Digit%,1!%Ret%
if "%Num%" neq "0" goto :Dec2BaseLoop
Endlocal&Set "%3=%Ret%"&Goto :Eof
::-------------------------------------------------------------------------------------

:Base2Dec Base BaseIn DecBack
Setlocal EnableDelayedExpansion
Set /A "Base=%1,PlaceVal=1,Ret=0"
Echo:%2|findstr /i "^[!map:,%Base%!]*$" >Nul 2>&1 ||(Echo invalid char for base %1&Goto :Eof)
Set Val=%2

:Base2DecLoop
Set "Digit=%Val:~-1%"
If %Digit% Leq 9 goto :Next
For /L %%i in (10,1,%Base%) Do If /i "!Digit!" Equ "!map:~%%i,1!" (Set "Digit=%%i" & Goto :Next )
Echo Something went wrong & Pause

:Next
set /A "Ret+=Digit * PlaceVal,PlaceVal *= Base"
Set "Val=%Val:~0,-1%"
If defined Val goto :Base2DecLoop
Endlocal & Set "%3=%Ret%" & Goto :Eof
样本输出:

> Q:\Test\2017\09\16\SO_46254352.cmd
enter value: 4095
DecBack=4095  Base  2=111111111111
DecBack=4095  Base 16=FFF
DecBack=4095  Base 32=3VV
enter value: 0xBadAffe
DecBack=195932158  Base  2=1011101011011010111111111110
DecBack=195932158  Base 16=BADAFFE
DecBack=195932158  Base 32=5QRBVU

在函数中,它表示

(放入带有BOM EFBBBF的UTF-8.txt文件中,第一行必须为空)


由于算法保持不变,您可以传递要转换的基,并且只有一个子例程。这个问题比堆栈溢出更适合,因为只要用户真正输入十进制数,代码就已经工作正常(或以
0x
开头的十六进制数或以
0
开头的八进制数)。请您解释一下下面这行的意义好吗?Echo:%2 | findstr/i“^[%map:~0,10%]*$”>nul2>&1 | | |(Echo基10的无效字符&Goto:Eof),因为我后来添加了命令
set/a DecIN=DecIN
(允许十六进制输入)它不再重要。这将去除无效字符(被解释为VAR)。其目的是检查完整输入是否在与基数匹配的数字范围内。
cls
@echo off
cd /d "%~dp0"
chcp 65001 >nul
set title_script=Base conversion
title %title_script%

set "decimal_number=200"
set "result_hexadecimal="
call :function_change_base_number 10 decimal_number 16 result_hexadecimal
echo %decimal_number% base 10 = %result_hexadecimal% base 16
echo.

set "octal_number=310"
set "result_binary="
call :function_change_base_number 8 octal_number 2 result_binary
echo %octal_number% base 8 = %result_binary% base 2
echo.

set "quaternary_number=3020"
set "base_36_result="
call :function_change_base_number 4 quaternary_number 36 base_36_result
echo %quaternary_number% base 4 = %base_36_result% base 36
echo.

pause
exit

:function_change_base_number
    setlocal enabledelayedexpansion
    set /a input_base=%~1
    set input_number=!%~2!
    set /a output_base=%~3

    rem UCase
    for %%i in ("a=A" "b=B" "c=C" "d=D" "e=E" "f=F" "g=G" "h=H" "i=I" "j=J" "k=K" "l=L" "m=M" "n=N" "o=O" "p=P" "q=Q" "r=R" "s=S" "t=T" "u=U" "v=V" "w=W" "x=X" "y=Y" "z=Z") do (
        call set "input_number=!input_number:%%~i!"
    )

    set map=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
    set map_base=!map:~0,%input_base%!
    set /a position=0
    set input_number_check=%input_number%
    :loop_1
        set current_map_base_character=!map_base:~%position%,1!
        set input_number_check=!input_number_check:%current_map_base_character%=!
        if "!input_number_check!" == "" goto next_1
        set /a position+=1
        if "!map_base:~%position%,1!" NEQ "" goto loop_1
        echo Error.
        echo Invalid character in base %input_base%.
        echo.
        pause
        exit
    :next_1

    set /a carry_flag=1
    set "input_number_tmp=%input_number%"
    set "result_decimal="
    :loop_2
        set "input_number_tmp_digit=%input_number_tmp:~-1%"
        if %input_number_tmp_digit% LEQ 9 goto next_2
        for /l %%i in (10,1,%input_base%) do (
            if /i "%input_number_tmp_digit%" EQU "!map:~%%i,1!" (
                set "input_number_tmp_digit=%%i"
                goto :next_2
            )
        )
        echo Error.
    :next_2
    set /a result_decimal+=input_number_tmp_digit * carry_flag
    set /a carry_flag *= input_base
    set "input_number_tmp=%input_number_tmp:~0,-1%"
    if defined input_number_tmp goto :loop_2

    set /a input_number_tmp=%result_decimal%
    set "result="
    :loop_3
        set /a "division_remainder=input_number_tmp %% !output_base!"
        set /a "input_number_tmp /= !output_base!"
        set result=!map:~%division_remainder%,1!%result%
        if "%input_number_tmp%" NEQ "0" goto loop_3
    endlocal & set %~4=%result%
goto :eof