【问题标题】:Windows batch equivalent of hexdump -ve '1/1 "%.2x"'相当于 hexdump -ve '1/1 "%.2x"' 的 Windows 批处理
【发布时间】:2019-10-18 06:19:30
【问题描述】:

我需要获取我拥有的文件的十六进制值。

在 linux 上,这很简单:

hexdump -ve '1/1 "%.2x"' Filename

但是,在 Windows 上,我找不到 hexdump 的良好等效项。我正在使用 MinGW64,所以基本上我正在寻找一个可以简单地添加到我的 MinGW 存储库中的 hexdump.exe。我确实找到了其中两个,但没有一个与 linux 相同;它们与hexdump -C 相同

那么,你知道一个好的等价物,或者用其他功能获得我想要的东西的方法吗? (但没有 PowerShell 功能)。如果有帮助的话,我得到了 sed 和 awk...

这是一个例子;如果我有这个名为 TEST 的文件:

测试:

test test test

那么我想要这个结果:

746573742074657374207465737420

(没有任何换行符)

【问题讨论】:

  • @dbenham 为此创建了一个batch file,您可以下载并使用它。将其保存为hexdump.cmd 您可以使用hexdump /H 运行它以查看使用情况。类似hex_dump.cmd /I TEST.txt /O output /NL /NA /NO
  • 要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是题外话。 Please edit your question 提出您的问题,如果您包含您的代码并解释它所展示的具体问题,您可以这样做。 This possible duplicate 可以帮助您为此编写代码。
  • 谢谢,这行得通!你可以把它作为答案:)
  • @Compo 我不确定它是否应该进入“软件推荐”部分,因为我不想要专门的软件,而是任何可以做与 Windows 中的hexdump -ve '1/1 "%.2x"'相同的东西.也可以是另一个函数或一堆命令。由于hexdump 是一个shell 函数,并且大多数Windows 等效于shell 函数在堆栈溢出中被询问,我将它放在堆栈溢出中。对我来说似乎是合法的。至于“重复”,它在堆栈溢出中(并且不是重复的。要求将十六进制值写入文件,而不是文件的十六进制值。但是,其中有很好的提示。)
  • 试试这个:CertUtil -encodehex infile.txt outfile.hex 12...

标签: batch-file equivalent hexdump


【解决方案1】:

注意我对此完全没有信用。我只是将其发布为对未来问题的参考。

@Dbenham为此在Dostips创建了一个很棒的脚本

运行hexdump /h可以找到使用信息

示例用法:hex_dump.cmd /I TEST.txt /O output /NL /NA /NO

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:::
:::HEXDUMP [/Option [Value]]...
:::
:::  Writes the content of stdin as hexadecimal to stdout, with 16 bytes per line,
:::  using the following format:
:::
:::    OOOOOOO XX XX XX XX XX XX XX XX  XX XX XX XX XX XX XX XX   AAAAAAAAAAAAAAAA
:::
:::  where:
:::
:::    0000000          = the hexadecimal offset within the input
:::    XX               = the hexadecimal value of a byte
:::    AAAAAAAAAAAAAAAA = the bytes as ASCII (control codes and non-ASCII as .)
:::
:::  Output is encoded as ASCII, with each line terminated by CarriageReturn
:::  LineFeed.
:::
:::  The behavior can be modified by appending any combination of the following
:::  options:
:::
:::    /I InFile  - Input from InFile instead of stdin
:::    /O OutFile - Output to OutFile instead of stdout: - overwrites InFile
:::    /NA - No ASCII
:::    /NO - No Offsets
:::    /R  - Raw hexadecimal on a single line, with no space between bytes
:::    /LF - LineFeed as line terminator instead of CarriageReturn LineFeed
:::    /NL - No Line terminators, all output on one line without line terminator
:::    /U  - Unicode encoded output with BOM (UTF-16)
:::    /V  - Write version info to stdout
:::    /?  - Write this help to stdout
:::
:::HEXDUMP.BAT version 2.1 was written by Dave Benham
:::and is maintained at https://www.dostips.com/forum/viewtopic.php?f=3&t=8816

@echo off
setlocal disableDelayedExpansion
set "tempRoot="

:: Define options
set "/options= /I:"" /LF: /NA: /NL: /NO: /O:"" /R: /U: /V: /?: "

:: Set default option values
for %%O in (%/options%) do for /f "tokens=1,* delims=:" %%A in ("%%O") do set "%%A=%%~B"
set "/?="

:GetOptions
if not "%~1"=="" (
  set "/test=%~1"
  setlocal enableDelayedExpansion
  if "!/test:~0,1!" neq "/" call :exitErr "Invalid argument" 1
  set "/test=!/options:*%~1:=! "
  if "!/test!"=="!/options! " (
      endlocal
      call :exitErr "Invalid option %~1" 1
  ) else if "!/test:~0,1!"==" " (
      endlocal
      set "%~1=1"
  ) else (
      endlocal
      set "%~1=%~2"
      shift /1
  )
  shift /1
  goto :GetOptions
)

if defined /? (
  for /f "delims=: tokens=*" %%A in ('findstr "^:::" "%~f0"') do @echo(%%A
  exit /b 0
)

if defined /V (
  for /f "delims=: tokens=*" %%A in ('findstr /bic:":::HEXDUMP.BAT version" "%~f0"') do echo(%%A
  exit /b 0
)

if "%/O%"=="-" if not defined /I call :exitErr "Cannot write to stdin" 1

set /a "type= 11 - 0%/NA% - 0%/NO%*2"
if %type%==9 set "type=5"
if defined /R set "type=12"
set /a "type|= (0%/LF%*0x80000000 | 0%/NL%*0x40000000)"
if %type% lss 0 cmd /c exit /b %type%
if %type% lss 0 set "type=0x%=exitCode%"

set "unicode="
if defined /U set "unicode=-UnicodeText"

if defined /I set "in=%/I%" & goto :getOutput
call :getTempRoot
set "in=%tempRoot%.stdin"
cscript //nologo //E:JScript "%~f0" "%in%"

:getOutput
if "%/O%" equ "-" set "out=%~1" & goto :go
if defined /O set "out=%/O%" & goto :go
if not defined tempRoot call :getTempRoot
set "out=%tempRoot%.hexdump"

:go
(certutil %unicode% -f -encodehex "%in%" "%out%" %type% || echo ERROR: HexDump failed during CertUtil processing) | findstr "ERROR" >&2 && call :exit 1

if not defined /O (findstr "^" "%out%") else echo Hexdump successfully written to "%out%".
call :exit 0

:getTempRoot
set "tempRoot="
if defined temp for %%T in ("%temp%") do set "tempRoot=%%~fT\"
if not defined tempRoot if defined tmp for %%T in ("%tmp%") do set "tempRoot=%%~fT\"
set "tempRoot=%tempRoot%%~nx0.%time::=_%.%random%"
if exist "%tempRoot%.lock" goto :getTempRoot
2>nul (break >"%tempRoot%.lock") || goto :getTempRoot
exit /b

:exitErr
>&2 echo ERROR: %~1.
shift
:: Fall through to :exit

:exit
if defined tempRoot del "%tempRoot%.*"
(goto) 2>nul & exit /b %1


************* JScript portion - read stdin and write to file defined by arg0 **********/
var fso = new ActiveXObject("Scripting.FileSystemObject");
var out = fso.OpenTextFile(WScript.Arguments(0),2,true);
var chr;
while( !WScript.StdIn.AtEndOfStream ) {
  chr=WScript.StdIn.Read(1000000);
  out.Write(chr);
}

还有一个较旧的“纯批处理版本”here 显然也是由Dave Benham 创建的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2018-10-08
    相关资源
    最近更新 更多