Как установить переменную среды в пакетном файле Windows с шестнадцатеричным представлением десятичного числа? - PullRequest
2 голосов
/ 17 ноября 2009

При использовании команд Windows set / p и set / a для приема шестнадцатеричного значения из командной строки и преобразования его в десятичное. Что мне нужно, так это уметь принимать десятичное значение и переменную окружения с шестнадцатеричным эквивалентом.

Текущая кодировка командного файла:

@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

Производит:

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

Мне нужно установить HexV3 на b и HexV4 на 11.

Есть предложения?

Ответы [ 4 ]

6 голосов
/ 18 ноября 2009

Пакетный файл на канале 9 был слишком длинным для моих вкусов. Вот более простая (IMO) версия "tohex.bat", которую я только что написал:

@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%

Он работает во многом так же, как и другой скрипт (итеративно делится на 16), но для построения шестнадцатеричной строки используется поиск строки (вместо серии операторов if). Он также обрабатывает отрицательные числа (дополнение до двух), но это немного хак.

Вы можете вызвать его из другого командного файла так:

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

Надеюсь, это поможет.

3 голосов
/ 30 ноября 2011

Существует чрезвычайно быстрое и эффективное решение на http://www.dostips.com/DtCodeCmdLib.php#toHex. Как и выбранный ответ, он использует шестнадцатеричное отображение и поддерживает отрицательные числа. Он использует некоторые очень умные битовые манипуляции и выполняет все циклы с оператором FOR / L.

Выбранный ответ является относительно медленным, поскольку он основан на цикле GOTO.

1 голос
/ 17 февраля 2016

Я только что нашел отличное решение от Voodooman на http://www.dostips.com/forum/viewtopic.php?t=2261. Это работает только до 32 бит, но Вот мой скрипт-обертка, DecToHex.bat

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

Назовите это как:

>DecToHex.bat 123456 HEXVAL
>ECHO %HEXVAL%
0001E240
1 голос
/ 17 ноября 2009

Это сообщение на канале channel9.msdn.com содержит пакетный скрипт, который преобразует целое число в шестнадцатеричное.

If имеет цикл с использованием GOTO и обрабатывает число с использованием операторов по модулю - SET /A & % - и целочисленного деления - SET /A & / - и некоторых операторов IF для построения шестнадцатеричная строка.

...