在Windows批处理中将HEX值写入文件

您所在的位置:网站首页 有趣的bat程序 在Windows批处理中将HEX值写入文件

在Windows批处理中将HEX值写入文件

#在Windows批处理中将HEX值写入文件| 来源: 网络整理| 查看: 265

在Linux中我们可以做到

echo -n -e '\x66\x6f\x6f' > test.txt

将HEX值写入文件.

如何在Windows批处理中完成此操作?

1> dbenham..:

我假设您希望能够在\ x00到\ xFF范围内编写所有可能的二进制字节.不幸的是,纯批次没有提供一种简单的机制来完成这项工作.

但是有很多选择并不太难.

未记载的!=ExitCodeASCII!动态变量

该!=ExitCodeASCII!动态变量报告最近运行的外部命令的返回码的ASCII值.但它仅限于从\ x20到\ x7E的ASCII码.

我使用延迟扩展,所以我不必担心毒药字符.

返回特定错误代码的最简单机制是使用cmd /c exit N,其中N必须是十进制值.如果要传入十六进制值,则必须先将值转换为十进制.

Windows批处理使用0xNN表示法指定十六进制值.正如其他人所说,您可以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!

好处:

纯批次

缺点:

必须一次构建一个字符串

范围限制为0x20 - 0x7E

FORFILES

FORFILES命令支持0xNN语法,因此它可以生成大多数字符.但字符串必须通过CMD/C,因此它不能用于生成\ 0x00,\ 0x0A或\ 0x0D.(我没有测试过,但我相信所有其他值都有效,前提是毒性字符被适当引用或转义)

@echo off forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x660x6f0x6f"

好处:

纯批次

可以一次处理整个字符串

缺点:

没有本机XP支持

不支持0x00,0x0A或0x0D

逃避/引用毒药字符可能很棘手

CERTUTIL

CERTUTIL支持-decodeHex动词,它可以读取十六进制值并直接写入文件

@echo off >temp.txt echo(66 6f 6f 0d 0a certutil -f -decodehex temp.txt test.txt >nul del temp.txt

好处:

纯批次

支持所有可能的字节代码

绝对控制换行和回车

可以一次处理整个字符串(或文件!)

快速

缺点:

需要临时文件

混合JScript /批处理 - 简单的解决方案

在批处理脚本中嵌入和执行JScr​​ipt非常容易.JScript具有解释许多转义序列的本机能力,包括\ xNN.但是,\ xNN转义序列实际上映射到Unicode代码点,因此某些高阶字节代码不会映射到正确的字符值.高阶字节的结果可能会因您的机器默认字符集而异.

下面我定义一个:jWrite子例程,它可以写入带有嵌入转义序列的行.简单地改变WriteLine到Write,如果你想写不换行字符的字符串的JScript代码.

@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)+'"'));

好处:

从XP开始在所有Windows机器上本机运行的纯脚本

非常简单的JScript代码

可以一次处理整个字符串

许多其它的转义序列,如\\,\t,\r,\n,等.

易于将普通文本与转义序列混合,但双引号必须是 \x22

缺点:

并非所有高阶字节都给出正确的结果

结果取决于您机器的默认字符集.最好的Windows 1252

混合JScript /批处理 - 更强大,但复杂的解决方案

只要您的机器默认为Windows-1252,编写一些JScript代码来正确解释所有\ xNN代码以提供正确的字节并不困难.如果您的命令会话的活动代码页也与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+'"'); } } ));

好处:

从XP开始在所有Windows机器上本机运行的纯脚本

可以一次处理整个字符串

支持从\ x00到\ xFF的所有字节代码

许多其它的转义序列,如\\,\t,\r,\n,等.

易于将普通文本与转义序列混合,但双引号必须是 \x22

缺点:

如果您的机器默认为Windows-1252,则仅为所有字节提供正确的结果

中等复杂的JScript代码

JREPL.BAT - 混合JScript /批处理正则表达式文本处理实用程序

我的JREPL.BAT实用程序最初设计用于对文本文件执行正则表达式搜索和替换操作.但它有一些选项可以让它轻松编写带有嵌入式转义序列的字符串,并且无论机器使用什么默认字符集,它都可以为所有字节代码提供正确的结果.

如果您的机器默认使用任何单字节字符集,那么您可以安全地使用以下所有可能的转义序列,从\ x00到\ xFF,您可以在正常文本和转义序列中自由混合.

call jrepl $ "\x66\x6f\x6f" /s "=" /x /o test.txt

该/s "="选项将未定义的环境变量指定为输入源,将其解释为空字符串.第一个$参数匹配空字符串的结尾.第二个"\x66\x6f\x6f"参数指定替换值.该/x选项在替换字符串中启用转义序列,该/o test.txt选项指定输出文件.

如果要附加到test.txt,请添加该/APP选项.

如果你想要\n行结束而不是\ r \n,(Unix风格而不是Windows),那么添加/U选项

如果您不想要任何新的行终止符,请添加该/M选项.

最后,如果您的机器没有默认为单字节字符集,您仍然可以通过为输出格式指定单字节字符集(如Windows-1252)来强制所有转义序列的正确结果.但是,如果指定的字符集与命令会话的活动代码页不匹配,则只保证转义序列有效 - 某些正常的文本字符可能会产生错误的结果.

call jrepl $ "\x66\x6f\x6f" /s "=" /x /o "test.txt|Windows-1252"

好处:

从XP开始在任何Windows机器上运行的纯脚本

可以一次处理整个字符串

支持从\ x00到\ xFF的所有字节代码

许多其它的转义序列,如\\,\t,\r,\n,等.

易于将普通文本与转义序列混合,但双引号必须为\x22或\q

默认字符集不可知 - 始终可以提供正确的结果

一旦你的工具库中有JREPL,你会发现它有很多用途.它是一个强大的工具.

缺点:

需要下载第三方脚本



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3