sistema sirve que para online numeros hexadecimales hexadecimal ejemplos cabeceras binario archivos bash file-io hex

bash - sirve - Mostrar números hexadecimales de un archivo



para que sirve el sistema hexadecimal (4)

Quiero crear un programa de bash que pueda leer un archivo, como un * .bin e imprimir todos sus números hexadecimales, como hacen los editores "hex". ¿Dónde puedo empezar?


También puedes usar hexdump si lo tienes.

hexdump -x /usr/bin/binaryfile


Usted podría usar od. "od -x file" ¿Por qué reinventar esa rueda?


Utilice el comando od,

od -t x1 filename


Edición: Se agregó la funcionalidad "bytestream". Si el nombre del script contiene la palabra "flujo" (por ejemplo, es un enlace simbólico como ln -s bash-hexdump bash-hexdump-stream y se ejecuta como ./bash-hexdump-stream ), generará un flujo continuo 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 trucos ya que Bash no es realmente bueno en binario:

#!/bin/bash # bash-hexdump # by Dennis Williamson - 2010-01-04 # in response to http://.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 de apóstrofe se documenta here . La parte relevante dice:

Si el carácter inicial es una comilla simple o una comilla doble, el valor será el valor numérico en el conjunto de códigos subyacente del carácter que sigue a la comilla simple o comilla doble.

Aquí hay una salida del script que muestra las primeras líneas de mi /bin/bash y algunas 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.........|