开发者

Within a windows batch file, how do I set an environment variable with the hexadecimal representation of a decimal number?

When using the Windows set /p and set /a commands to accept a开发者_如何学C hexadecimal value from the command line and convert it to decimal. What I need is to be able to take a decimal value and set and environment variable with its hexadecimal equivalent.

Current batch file coding:

@echo off
set HexV1=%1
set HexV2=%2
set /A DecV1=0x%HexV1%
set /A DecV2=0x%HexV2%
set /A HexV3=0x%HexV1% + 0x1
set /A HexV4=0x%Hexv2% + 0x2
set Dec
set Hex

Produces:

C:>hexmath a f
DecV1=10
DecV2=15
HexV1=a
HexV2=f
HexV3=11
HexV4=17

What I need is to be able to set HexV3 to b and HexV4 to 11.

Any suggestions?


The batch file on channel9 was much to long for my tastes. Here's a simpler (IMO) version of "tohex.bat" that I just whipped up:

@echo off & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set LOOKUP=0123456789abcdef &set HEXSTR=&set PREFIX=
if "%1"=="" echo 0&goto :EOF
set /a A=%*
if !A! LSS 0 set /a A=0xfffffff + !A! + 1 & set PREFIX=f
:loop
set /a B=!A! %% 16 & set /a A=!A! / 16
set HEXSTR=!LOOKUP:~%B%,1!%HEXSTR%
if %A% GTR 0 goto :loop
echo %PREFIX%%HEXSTR%

It works in much the same way as the other script (iteratively dividing by 16), but it uses a string lookup (instead of a series of "if" statements) to build the hex string. It handles negative numbers as well (two's complement), but it's a bit of a hack.

You could call it from your other batch file like so:

for /f "delims=" %%Q IN ('call tohex.bat 0x%HexV1% + 0x1') DO SET HexV3=%%Q

Hope that helps.


There is an extremely fast and efficient solution at http://www.dostips.com/DtCodeCmdLib.php#toHex. Like the selected answer, it uses a hex map and supports negative numbers. It uses some very clever bit manipulation, and does all looping with a FOR /L statement.

The selected answer is comparatively slow because it relies on a GOTO loop.


This forum post at channel9.msdn.com has a batch script that will convert from integer to hex.

If has a loop using a GOTO and processes the number using the modulo - SET /A & % - and integer division - SET /A & / - operators and some IF statements to build up the hex string.


I just found a great solution from Voodooman at http://www.dostips.com/forum/viewtopic.php?t=2261. It only works up to 32 bit tho :-( Here's my wrapper script, DecToHex.bat

CALL CMD.EXE /C EXIT /B %~1
SET HEXVAL=%=EXITCODE%
SET "%~2=%HEXVAL%"
EXIT /B 0

Call it like:

>DecToHex.bat 123456 HEXVAL
>ECHO %HEXVAL%
0001E240
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜