67 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #From: "dennis" <dennis@netstrata.com>
 | |
| #To: <bash-maintainers@gnu.org>
 | |
| #Subject: New example script: bash-hexdump
 | |
| #Date: Mon, 4 Jan 2010 22:48:19 -0700
 | |
| #Message-ID: <6dbec42d$64fcdbd2$4a32cf2d$@com>
 | |
| 
 | |
| #I've written a script that functions like "hexdump -C" or "hd". If you'd 
 | |
| #like to include it in a future distribution of example Bash scripts, I have 
 | |
| #included it here: 
 | |
| 
 | |
| #!/bin/bash
 | |
| # bash-hexdump# pure Bash, no externals
 | |
| # by Dennis Williamson - 2010-01-04
 | |
| # in response to 
 | |
| http://stackoverflow.com/questions/2003803/show-hexadecimal-numbers-of-a-file
 | |
| # usage: bash-hexdump file
 | |
| saveIFS="$IFS"
 | |
| IFS=""                     # disables interpretation of \t, \n and space
 | |
| saveLANG="$LANG"
 | |
| LANG=C                     # allows characters > 0x7F
 | |
| bytecount=0
 | |
| valcount=0
 | |
| printf "%08x  " $bytecount
 | |
| while read  -d '' -r -n 1 char    # -d '' allows newlines, -r allows \
 | |
| do
 | |
|    ((bytecount++))
 | |
|    # for information about the apostrophe in this printf command, see
 | |
|    #  http://www.opengroup.org/onlinepubs/009695399/utilities/printf.html
 | |
|    printf -v val "%02x" "'$char"
 | |
|    echo -n "$val "
 | |
|    ((valcount++))
 | |
|    if [[ "$val" < 20 || "$val" > 7e ]]
 | |
|    then
 | |
|        string+="."                  # show unprintable characters as a dot
 | |
|    else
 | |
|        string+=$char
 | |
|    fi
 | |
|    if (( bytecount % 8 == 0 ))      # add a space down the middle
 | |
|    then
 | |
|        echo -n " "
 | |
|    fi
 | |
|    if (( bytecount % 16 == 0 ))   # print 16 values per line
 | |
|    then
 | |
|        echo "|$string|"
 | |
|        string=''
 | |
|        valcount=0
 | |
|        printf "%08x  " $bytecount
 | |
|    fi
 | |
| done < "$1"
 | |
| 
 | |
| 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))
 | |
|    printf "%${length}s\n" "|$string|"
 | |
|    printf "%08x  " $bytecount
 | |
| fi
 | |
| echo
 | |
| 
 | |
| LANG="$saveLANG";
 | |
| IFS="$saveIFS"
 | |
| 
 | |
| exit 0
 | 
