Saltar al contenido

Escribir valores HEX en un archivo en lote de Windows

Bienvenido a proyecto on line, en este lugar vas a hallar la solucíon a lo que necesitas.

Solución:

Supongo que desea la capacidad de escribir todos los bytes binarios posibles en el rango x00 a xFF. Desafortunadamente, el lote puro no proporciona un mecanismo simple para hacer esto.

Pero hay una serie de opciones que no son demasiado difíciles.

Indocumentado !=ExitCodeASCII! variable dinámica

los !=ExitCodeASCII! La variable dinámica informa el valor ASCII del código de retorno del comando externo ejecutado más recientemente. Pero está limitado a códigos ASCII desde x20 hasta x7E.

Utilizo la expansión retardada para no tener que preocuparme por los personajes venenosos.

El mecanismo más simple para devolver un código de error específico es usar cmd /c exit N, donde N debe ser un valor decimal. Si desea pasar un valor hexadecimal, primero debe convertir el valor a decimal.

El lote de Windows usa la notación 0xNN para especificar un valor hexadecimal. Como han señalado otros, puede utilizar set /a val=0x66 para hacer la conversión. Otra opción es usar for /l %%N in (0x66 1 0x66) do ..., la ventaja es que no necesita definir una variable de entorno intermedia para mantener el valor.

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

Ventajas:

  • Lote puro

Desventajas:

  • Debe construir string un personaje a la vez
  • Rango limitado a 0x20 – 0x7E

FORFILES

El comando FORFILES admite la sintaxis 0xNN, por lo que puede generar la mayoría de los caracteres. Pero el string debe pasar por CMD / C, por lo que no se puede usar para generar 0x00, 0x0A o 0x0D. (No lo he probado, pero creo que todos los demás valores funcionan, siempre que los caracteres de veneno se citen o se escapen de manera adecuada)

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

Ventajas:

  • Lote puro
  • Puede procesar un string en una pasada

Desventajas:

  • Sin soporte nativo para XP
  • Sin soporte para 0x00, 0x0A o 0x0D
  • Escapar / citar personajes venenosos puede ser complicado

CERTUTIL

El CERTUTIL admite un verbo -decodeHex que puede leer valores hexadecimales y escribir directamente en un archivo

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

Ventajas:

  • Lote puro
  • Se admiten todos los códigos de bytes posibles
  • Control absoluto de nuevas líneas y retornos de carro
  • Puede procesar un string (o archivo!) en una sola pasada
  • Rápido

Desventajas:

  • Requiere un archivo temporal

JScript híbrido / lote: solución simple

Es muy fácil incrustar y ejecutar JScript dentro de un script por lotes. Y JScript tiene la capacidad nativa de interpretar muchas secuencias de escape, incluido xNN. Sin embargo, las secuencias de escape xNN en realidad se asignan a puntos de código Unicode, por lo que algunos de los códigos de bytes de orden superior no se asignan a los valores de caracteres correctos. Y los resultados para bytes de orden superior pueden variar según el juego de caracteres predeterminado de su máquina.

A continuación, defino una subrutina: jWrite que puede escribir líneas con secuencias de escape incrustadas. Simplemente cambie el WriteLine para Write en el código JScript si desea escribir cadenas sin los caracteres de nueva línea.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:: -------- Batch code --------------
@echo off
call :jWrite "x66x6fx6f" >test.txt
exit /b

:jWrite
cscript.exe //E:JScript //nologo "%~f0" %1
exit /b
:: --------- JScript code -----------*/
WScript.StdOut.WriteLine(eval('"'+WScript.Arguments.Unnamed(0)+'"'));

Ventajas:

  • Script puro que se ejecuta de forma nativa en todas las máquinas con Windows desde XP en adelante
  • Código JScript muy simple
  • Puede procesar cadenas enteras en una sola pasada
  • Muchas otras secuencias de escape disponibles, como \, t, r, netc.
  • Fácil de mezclar texto ordinario con secuencias de escape, pero se deben usar comillas dobles. x22

Desventajas:

  • No todos los bytes de orden superior dan el resultado correcto
  • Los resultados dependen del juego de caracteres predeterminado de su máquina. Mejor si Windows 1252

JScript híbrido / lote: solución más robusta pero compleja

No es demasiado difícil escribir algún código JScript para interpretar correctamente todos los códigos xNN para dar el byte correcto siempre que su máquina tenga Windows-1252 por defecto. Y si la página de códigos activa de su sesión de comandos también coincide con Windows 1252, entonces puede mezclar libremente el texto normal.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
:: -------- Batch code --------------
@echo off
call :jWrite "x66x6fx6f"
call :jWrite "Hellonworldx80"
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+'"');
    
  
));

Ventajas:

  • Script puro que se ejecuta de forma nativa en todas las máquinas con Windows desde XP en adelante
  • Puede procesar cadenas enteras en una sola pasada
  • Se admiten todos los códigos de bytes desde x00 hasta xFF
  • Muchas otras secuencias de escape disponibles, como \, t, r, netc.
  • Fácil de mezclar texto ordinario con secuencias de escape, pero se deben usar comillas dobles. x22

Desventajas:

  • Solo da resultados correctos para todos los bytes si su máquina está predeterminada en Windows-1252
  • Código JScript moderadamente complejo

JREPL.BAT – Utilidad de procesamiento de texto de expresión regular híbrida JScript / por lotes

Mi utilidad JREPL.BAT se diseñó originalmente para realizar operaciones de búsqueda y reemplazo de expresiones regulares en archivos de texto. Pero tiene opciones que le permiten escribir fácilmente cadenas con secuencias de escape incrustadas, y puede dar el resultado correcto para todos los códigos de bytes sin importar qué juego de caracteres predeterminado use su máquina.

Si su máquina tiene por defecto cualquier conjunto de caracteres de un solo byte, entonces puede usar con seguridad lo siguiente con todas las posibles secuencias de escape desde x00 hasta xFF, y puede mezclar libremente texto normal junto con secuencias de escape.

call jrepl $ "x66x6fx6f" /s "=" /x /o test.txt

los /s "=" La opción especifica una variable de entorno indefinida como fuente de entrada, que se interpreta como una string. El primero $ argumento coincide con el final del vacío string. El segundo "x66x6fx6f" argumento especifica el valor de reemplazo. los /x La opción habilita secuencias de escape dentro del reemplazo. string, y el /o test.txt La opción especifica el archivo de salida.

Si desea agregar a test.txt, agregue el /APP opción.

Si desea n fin de línea en lugar de r n, (estilo Unix en lugar de Windows), agregue el /U opción

Si no desea nuevos terminadores de línea, agregue el /M opción.

Por último, si su máquina no tiene por defecto un juego de caracteres de un solo byte, aún puede forzar el resultado correcto para todas las secuencias de escape especificando un juego de caracteres de un solo byte como Windows-1252 para el formato de salida. Sin embargo, si el conjunto de caracteres especificado no coincide con la página de códigos activa de la sesión de comandos, solo se garantiza que funcionen las secuencias de escape; algunos caracteres de texto normales pueden dar un resultado incorrecto.

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

Ventajas:

  • Script puro que se ejecuta en cualquier máquina con Windows desde XP en adelante
  • Puede procesar cadenas enteras en una sola pasada
  • Se admiten todos los códigos de bytes desde x00 hasta xFF
  • Muchas otras secuencias de escape disponibles, como \, t, r, netc.
  • Fácil de mezclar texto ordinario con secuencias de escape, pero se deben usar comillas dobles. x22 o q
  • Agnóstico del juego de caracteres predeterminado: siempre puede dar el resultado correcto
  • Una vez que tenga JREPL en su arsenal de herramientas, encontrará muchos usos para él. Es una herramienta poderosa.

Desventajas:

  • Requiere la descarga de un script de terceros

Tienes la posibilidad mostrar esta noticia si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *