在CMD.EXE批处理文件格式的十六进制序列 [英] Format a hexadecimal sequence in a cmd.exe batch file

查看:1525
本文介绍了在CMD.EXE批处理文件格式的十六进制序列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在一个Windows CMD脚本(又名蝙蝠脚本),我有一个 FOR / L循环从1到8,在这里我需要做移位并以某种方式格式化变量为十六进制号(如果你问,是单CPU标识符位送入 / AFFINITY )。

我无法弄清楚如何做的最后一步。这是我的 loop.cmd 文件:

  @ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR / L %% I IN(1,1,8)DO(
    SET / AJ = 1<< %%我
    ECHO %% i和!J 1

该做的一切,但格式化十六进制数字:

  1和2
2和4
图3和8
图4和16
5和32
6和64
7和128
8和256

预期成果是:

  1和2
2和4
图3和8
4和10
5和20
6和40
7和80
8和100

你如何格式化十六进制数?


解决方案

  @ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR / L %% I IN(1,1,8)DO(
    SET / AJ = 1<< %%我
    CALL:DECTOHEXĴ
    ECHO %% i和!J 1

GOTO:EOF:DECTOHEX VAR
SETDEC =%!1!
SETHEX =
:下一个
    SET /数字= DEC %% 16,DEC / = 16
    SETHEX =%DIGIT %% HEX%。
IF%DEC%NEQ 0 GOTO NEXT
SET%1 =%HEX%
EXIT / B

修改回复评论

previous解决方案正常工作时移值,只在一个位的如问题陈述的。如果移位值可能在随后有几个位需要一个更一般的十进制到十六进制的转换,像下面这样:

  @ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSIONREM定义HEXA DIGITS
SETHEXA = 0123456789ABCDEFFOR / L %% I IN(1,1,8)DO(
    SET / AJ = 3';< %%我
    CALL:DECTOHEXĴ
    ECHO %% i和!J 1

GOTO:EOF:DECTOHEX VAR
SETDEC =%!1!
SETHEX =
:下一个
    SET /数字= DEC %% 16,DEC / = 16
    SETHEX = HEXA:!〜%DIGIT%,1%HEX%
IF%DEC%NEQ 0 GOTO NEXT
SET%1 =%HEX%
EXIT / B

In a Windows cmd script (aka bat script), I have a FOR /L loop from 1 to 8, where I need to do a bit shift and somehow format a variable as a hexadecimal number (which if you ask, is a single CPU identifier bit to feed into /AFFINITY).

I can't figure out how to do the last step. This is my loop.cmd file:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (1,1,8) DO (
    SET /A "J=1<<%%i"
    ECHO %%i and !J!
)

which does everything but format a hex number:

1 and 2
2 and 4
3 and 8
4 and 16
5 and 32
6 and 64
7 and 128
8 and 256

expected output is:

1 and 2
2 and 4
3 and 8
4 and 10
5 and 20
6 and 40
7 and 80
8 and 100

How do you format a hexadecimal number?

解决方案

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (1,1,8) DO (
    SET /A "J=1<<%%i"
    CALL :DECTOHEX J
    ECHO %%i and !J!
)
GOTO :EOF

:DECTOHEX VAR
SET "DEC=!%1!"
SET "HEX="
:NEXT
    SET /A DIGIT=DEC%%16, DEC/=16
    SET "HEX=%DIGIT%%HEX%"
IF %DEC% NEQ 0 GOTO NEXT
SET "%1=%HEX%"
EXIT /B

EDIT: Reply to the comment

Previous solution works correctly when the shifted value have just one bit on, as stated in the question. If the shifted value may have several bits on then a more general decimal-to-hexadecimal conversion is required, like the one below:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

REM DEFINE THE HEXA DIGITS
SET "HEXA=0123456789ABCDEF"

FOR /L %%i IN (1,1,8) DO (
    SET /A "J=3<<%%i"
    CALL :DECTOHEX J
    ECHO %%i and !J!
)
GOTO :EOF

:DECTOHEX VAR
SET "DEC=!%1!"
SET "HEX="
:NEXT
    SET /A DIGIT=DEC%%16, DEC/=16
    SET "HEX=!HEXA:~%DIGIT%,1!%HEX%"
IF %DEC% NEQ 0 GOTO NEXT
SET "%1=%HEX%"
EXIT /B

这篇关于在CMD.EXE批处理文件格式的十六进制序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆