Quiero construir un programa bash que pueda leer un archivo, como un * .bin e imprimir todos sus números hexadecimales, como lo hacen los editores 'hexadecimales'. Donde puedo comenzar?Mostrar números hexadecimales de un archivo
Respuesta
Editar: Agregado funcionalidad "bytestream". Si el nombre del script contiene la palabra "stream" (por ejemplo, es un enlace simbólico como ln -s bash-hexdump bash-hexdump-stream
y se ejecuta como ./bash-hexdump-stream
), generará una secuencia continua de caracteres hexadecimales que representan el contenido del archivo. De lo contrario, su salida se verá como hexdump -C
.
Se necesita un montón de engaños ya Bash no es muy bueno en binario:
#!/bin/bash
# bash-hexdump
# by Dennis Williamson - 2010-01-04
# in response to http://stackoverflow.com/questions/2003803/show-hexadecimal-numbers-of-a-file
# usage: bash-hexdump file
if [[ -z "$1" ]]
then
exec 3<&0 # read stdin
[[ -p /dev/stdin ]] || tty="yes" # no pipe
else
exec 3<"$1" # read file
fi
# if the script name contains "stream" then output will be continuous hex digits
# like hexdump -ve '1/1 "%.2x"'
[[ $0 =~ stream ]] && nostream=false || nostream=true
saveIFS="$IFS"
IFS="" # disables interpretation of \t, \n and space
saveLANG="$LANG"
LANG=C # allows characters > 0x7F
bytecount=0
valcount=0
$nostream && printf "%08x " $bytecount
while read -s -u 3 -d '' -r -n 1 char # -d '' allows newlines, -r allows \
do
((bytecount++))
printf -v val "%02x" "'$char" # see below for the ' trick
[[ "$tty" == "yes" && "$val" == "04" ]] && break # exit on ^D
echo -n "$val"
$nostream && echo -n " "
((valcount++))
if [[ "$val" < 20 || "$val" > 7e ]]
then
string+="." # show unprintable characters as a dot
else
string+=$char
fi
if $nostream && ((bytecount % 8 == 0)) # add a space down the middle
then
echo -n " "
fi
if ((bytecount % 16 == 0)) # print 16 values per line
then
$nostream && echo "|$string|"
string=''
valcount=0
$nostream && printf "%08x " $bytecount
fi
done
if [[ "$string" != "" ]] # if the last line wasn't full, pad it out
then
length=${#string}
if ((length > 7))
then
((length--))
fi
((length += (16 - valcount) * 3 + 4))
$nostream && printf "%${length}s\n" "|$string|"
$nostream && printf "%08x " $bytecount
fi
$nostream && echo
LANG="$saveLANG";
IFS="$saveIFS"
El truco apóstrofe se documentó here. La parte pertinente dice:
Si el personaje principal es un comilla simple o doble cotización, el valor será el valor numérico en el conjunto de códigos subyacente del personaje después de la comilla simple o comillas dobles
Aquí es un poco de salida del script que muestra las primeras líneas de mi /bin/bash
además de unos cuantos más:
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 02 00 03 00 01 00 00 00 e0 1e 06 08 34 00 00 00 |............4...| 00000020 c4 57 0d 00 00 00 00 00 34 00 20 00 09 00 28 00 |.W......4. ...(.| 00000030 1d 00 1c 00 06 00 00 00 34 00 00 00 34 80 04 08 |........4...4...| . . . 00000150 01 00 00 00 2f 6c 69 62 2f 6c 64 2d 6c 69 6e 75 |..../lib/ld-linu| 00000160 78 2e 73 6f 2e 32 00 00 04 00 00 00 10 00 00 00 |x.so.2..........| 00000170 01 00 00 00 47 4e 55 00 00 00 00 00 02 00 00 00 |....GNU.........|
Utilice el comando od,
od -t x1 filename
¿Es 'od' un programa Linux o una función bash? Lo siento, soy un principiante. –
@Nathan Campos: puedes averiguar usando 'which od', si obtienes el nombre de un programa, entonces es un programa externo (para 'od', probablemente lo sea). –
bastante estándar en Unixes, ha existido desde el comienzo de los tiempos. –
Usted podría utilizar od. "od -x file" ¿Por qué reinventar esa rueda?
también se puede utilizar hexdump si lo tiene
hexdump -x /usr/bin/binaryfile
- 1. ¿Cómo pronuncias números hexadecimales grandes?
- 2. String.format() y números hexadecimales en Java
- 3. Representación de los números flotantes de Java como números hexadecimales
- 4. Trabajando con números hexadecimales en MySQL
- 5. Imprimir una matriz de enteros como números hexadecimales
- 6. Cómo mostrar bytes hexadecimales utilizando NSLog
- 7. ¿Cómo mostrar los valores hexadecimales del conjunto de bytes?
- 8. JavaScript expresiones regulares - coincide con una serie de números hexadecimales
- 9. Conversión de números octales y hexadecimales a la base 10
- 10. bit a bit XOR de números hexadecimales en python
- 11. Cómo imprimir números hexadecimales en PHP o Java
- 12. Menos: Mostrar números de línea, números de archivo y línea de origen en CSS procesado
- 13. Conversión de números hexadecimales en cadenas a números negativos, en Perl
- 14. ¿Cómo se muestran los números hexadecimales en C?
- 15. ¿Por qué los números hexadecimales tienen el prefijo 0x?
- 16. ¿Cómo puedo convertir números hexadecimales a binarios en C++?
- 17. Lua: escribir valores hexadecimales como un archivo binario
- 18. Mostrar números sin puntos decimales
- 19. Cómo convertir un NSString en valores hexadecimales
- 20. ¿Cómo se escriben los valores hexadecimales de un carácter en ASCII en un archivo de texto?
- 21. ¿Por qué usar constantes hexadecimales?
- 22. Cómo escribir números enteros en un archivo
- 23. mostrar números en el gráfico circular
- 24. ¿Por qué usar valores hexadecimales en lugar de números normales de base 10?
- 25. Mostrar números como binarios de una fuente vinculada
- 26. Modo E de Emacs: cómo resaltar la sintaxis con números hexadecimales?
- 27. ¿Cómo puedo convertir números hexadecimales a decimales en calc de Emacs?
- 28. ¿Cómo puedo transmitir números hexadecimales con A-F (en lugar de a-f)?
- 29. ¿Cómo mostrar los números de línea por defecto en SciTE?
- 30. Interpretando valores hexadecimales?
http://unix.stackexchange.com/questions/10826/shell-how- to-read-the-bytes-of-a-binary-file-and-print-as-hexadecimal –