echo -n -e '\x66\x6f\x6f' > test.txt
如何在Windows批处理中简单地将HEX值写入文件?
echo -n -e '\x66\x6f\x6f' > test.txt
如何在Windows批处理中简单地将HEX值写入文件?
!=ExitCodeASCII!
动态变量
!=ExitCodeASCII!
动态变量报告最近运行的外部命令的返回代码的ASCII值。但它仅限于\x20到\x7E的ASCII码。cmd /c exit N
,其中N必须是十进制值。如果要传递十六进制值,则必须先将该值转换为十进制。set /a val=0x66
进行转换。另一个选择是使用for /l %%N in (0x66 1 0x66) do ...
,其优点是您不需要定义一个中间环境变量来保存该值。@echo off
setlocal enableDelayedExpansion
set "str="
for %%H in (0x66 0x6f 0x6f) do (
for /l %%N in (%%H 1 %%H) do cmd /c exit %%N
set "str=!str!!=ExitCodeASCII!"
)
>test.txt echo(!str!
优点:
缺点:
FORFILES命令支持0xNN语法,因此它可以生成大多数字符。但字符串必须通过CMD / C传递,因此不能用于生成\0x00、\0x0A或\0x0D。(我没有测试,但我相信所有其他值都可以正常工作,只要有毒字符被适当地引用或转义)
@echo off
forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x660x6f0x6f"
优点:
缺点:
CERTUTIL支持一个-decodeHex动词,可以读取十六进制值并直接写入文件。
@echo off
>temp.txt echo(66 6f 6f 0d 0a
certutil -f -decodehex temp.txt test.txt >nul
del temp.txt
优点:
缺点:
在批处理脚本中嵌入和执行JScript非常容易。并且JScript具有本地解释许多转义序列的能力,包括\xNN。但是,\xNN转义序列实际上映射到Unicode代码点,因此一些高阶字节码不能正确映射到字符值。而高阶字节的结果可能会因您计算机的默认字符集而异。
下面我定义了一个:jWrite子例程,它可以写带有嵌入式转义序列的行。如果您想写没有换行符的字符串,则只需在JScript代码中将WriteLine
更改为Write
。
@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:: -------- Batch code --------------
@echo off
call :jWrite "\x66\x6f\x6f" >test.txt
exit /b
:jWrite
cscript.exe //E:JScript //nologo "%~f0" %1
exit /b
:: --------- JScript code -----------*/
WScript.StdOut.WriteLine(eval('"'+WScript.Arguments.Unnamed(0)+'"'));
优点:
\\
、\t
、\r
、\n
等\x22
缺点:
编写一些 JScript 代码以正确解释所有 \xNN 代码并给出正确的字节并不太困难,只要您的计算机默认为 Windows-1252。如果您的命令会话的活动代码页也匹配 Windows 1252,则可以自由混合普通文本。
@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:: -------- Batch code --------------
@echo off
call :jWrite "\x66\x6f\x6f"
call :jWrite "Hello\nworld\x80"
exit /b
:jWrite
cscript.exe //E:JScript //nologo "%~f0" %1
exit /b
:: --------- JScript code -----------*/
WScript.StdOut.WriteLine(WScript.Arguments.Unnamed(0).replace(
/\\(\\|b|f|n|r|t|v|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})/g,
function($0,$1) {
switch ($1.toLowerCase()) {
case 'x80': return '\u20AC';
case 'x82': return '\u201A';
case 'x83': return '\u0192';
case 'x84': return '\u201E';
case 'x85': return '\u2026';
case 'x86': return '\u2020';
case 'x87': return '\u2021';
case 'x88': return '\u02C6';
case 'x89': return '\u2030';
case 'x8a': return '\u0160';
case 'x8b': return '\u2039';
case 'x8c': return '\u0152';
case 'x8e': return '\u017D';
case 'x91': return '\u2018';
case 'x92': return '\u2019';
case 'x93': return '\u201C';
case 'x94': return '\u201D';
case 'x95': return '\u2022';
case 'x96': return '\u2013';
case 'x97': return '\u2014';
case 'x98': return '\u02DC';
case 'x99': return '\u2122';
case 'x9a': return '\u0161';
case 'x9b': return '\u203A';
case 'x9c': return '\u0153';
case 'x9d': return '\u009D';
case 'x9e': return '\u017E';
case 'x9f': return '\u0178';
default: return eval('"'+$0+'"');
}
}
));
优点:
\\
、\t
、\r
、\n
等\x22
缺点:
我的JREPL.BAT实用程序最初是设计用于在文本文件上执行正则表达式搜索和替换操作的。但它具有允许轻松编写带有嵌入式转义序列的字符串的选项,并且无论您的机器使用什么默认字符集,它都可以给出所有字节代码的正确结果。
如果您的机器默认为任何单字节字符集,则可以安全地使用以下内容,其中包括从\x00到\xFF的所有可能的转义序列,并且您可以自由混合普通文本和转义序列。
call jrepl $ "\x66\x6f\x6f" /s "=" /x /o test.txt
/s "="
选项将未定义的环境变量作为输入源,被解释为一个空字符串。第一个$
参数匹配空字符串的末尾。第二个"\x66\x6f\x6f"
参数指定替换值。/x
选项启用替换字符串中的转义序列,/o test.txt
选项指定输出文件。/APP
选项。/U
选项。/M
选项。call jrepl $ "\x66\x6f\x6f" /s "=" /x /o "test.txt|Windows-1252"
优点:
\\
、\t
、\r
、\n
等\x22
或\q
缺点:
将“HEX值写入文件”:
set a=.
for /l %a in (0,1,255) do (
set /a dec=%a >nul
call cmd /c exit /b !dec!
set hex=!=exitcode!
set a=!a! !hex:~-2!
)
echo %a:~2% > file.txt
certutil
可以同时实现以下两个功能:从二进制文件创建十六进制文件,以及从十六进制编码的文件创建二进制文件。certutil -f -decodeHex hex.txt out.bin >nul
certutil -f -encodeHex out.bin out.txt >nul
从CMD编写具有给定(解码)十六进制值字节的二进制文件:
set data="66 6F 6F"
echo Dim File : Set File = CreateObject("Scripting.FileSystemObject").CreateTextFile("test.txt") > tmp.vbs
echo data = %data% >> tmp.vbs
echo data = Split (data) >> tmp.vbs
echo for each x in data >> tmp.vbs
echo File.write chr("&H" ^& x) >> tmp.vbs
echo next >> tmp.vbs
echo File.Close >> tmp.vbs
cscript //nologo tmp.vbs
!=ExitCodeASCII!
是一个不错/更快的(批处理)解决方案。pwsh.exe -NoLogo -NoProfile -Command Write-Host "`u{64}`u{65}`u{66}" >test.txt
set /A
命令将十六进制值转换为十进制,并使用这些值从字符串中选择字符;这是一个简单的过程。批处理文件的主要问题是生成0-31范围内的控制字符,虽然这是可以做到的... - Aaciniascii
输出,只需要字符串形式的hex
值,是否尝试使用插入符号^来转义特殊字符echo ^\x66^\x6f^\x6f >test.txt
? - Gouravset /A
将hex
输出为Dec
- 您应该阅读此解决方案 Hex to Dec Using Set /A ,对于hex
666f6f 的dec
值为 6713199。 - Gourav