# SHAMINI SIVAPATHAM - GROUPE 16 # # Le programme ci dessous simule la commande 'hexdump'. Hexdump # renvoie une information organiséee en 3 colonnes. La colonne # de gauche représente l'offset par rapport au début du fichier # du premier caractère de la deuxieme colonne. La colonne du milieu # donne en hexadécimal les caractères du fichier en entrée modulo # le fait que ici le et le sont remplacés par des . Par # ailleurs les . sont remplacés par des .. La troisième colonne # donne le fichier modifié par les substitutions précédentes et avec # un affichage de 16 caractères par ligne. # # Le code est architecturé selon un traitement spécifique pour # chacune des colonnes. La difficulté principale est lors du # traitement de la 2eme colonne parce qu'il faut : # - les caractères doivent être affichés en minuscule : A->a, B->b # etc pour la deuxime colonne # - remplacer des par des 0 # - constituer deux groupes de 16 caracteres hexa # # Les substitutions des caracteres non imprimables sont faites au debut. # #!/bin/bash if [ $# -ge 1 ] # Vérification du nombre d'argument, then if [ -f $1 ] # Vérification que le fichier existe. # Sinon affichage d'un message d'erreur then # Stockage du résultat de la commande ls -l dans i i=`ls -l $1` # Correspond aux droits de lecture que l'on recupérer # dans i. Vérification que l'on a les droits if [ ${i:1:1} == 'r' -a ${i:4:1} == 'r' -a ${i:7:1} == 'r' ] then # # C'est à partir d'ici que l'on rentre dans le codage de # la solution # # Partie 1 : comme pour l'utilitaire hexdump, on doit # afficher 16 caracteres dans la colonne de droite. # On calcule donc le nombre de lignes de 16 caracteres # cv1=`cat $1` # cv1=`wc -c $1` ==> solution a exploiter pour obtenir le # nombre de bytes du fichier $1 nbelem=$((((${#cv1} / 16))+1)) # fin de la première partie # # Deuxieme partie # # on stocke dans cv2 le resultat de la commande gethex cv2=`./gethex $1` # on substitue les par des 0 cv2=`echo "$cv2" | sed 's/ /0/g'` # fin de la deuxieme partie # # Debut de la 3eme partie # # on traite la 3eme colonne : on substitue , et . # Attention a l'emploi de -E dans echo cv3=`cat $1` cv3=`echo -E "$cv3" | tr "\.$" "\.."` cv3=`echo -E "$cv3" | tr "\t$" "\."` cv3=`echo -E "$cv3" | tr "\n$" "\."` # # On reconstitue le resultat a partir d'ici # Je constitue une ligne qui est la concatenation # des traitements sur la premiere, deuxieme et troisieme # colonne for (( car1=0 ; car1<$nbelem ; car1=$(($car1+1)) )) do # on recupere les 16 premiers octets temp1="" for (( car2=$(($car1 * 32)); car2<$(((($car1 * 32)) +16)); car2=$(($car2+2)) )) do temp1="$temp1"" ${cv2:$car2:2}" done # on recupere les 16 octets suivants temp2="" for (( car2=$(((($car1 * 32 ))+16)); car2<$(((($car1 * 32))+32)); car2=$(($car2+2)) )) do temp2="$temp2"" ${cv2:$car2:2}" done # on concatene (separation par un ) les 16+16 bytes temp="$temp1"" $temp2" # Conversion en base 16 en utilisation la commande dc # On peut aussi utiliser la commande printf txt=`echo ""$(($car1*16))" "16" o p " | dc` # Tous les caractères en minuscule à cause du dc txt=`echo $txt | sed 's/.*/\L&/'` r=$((8-${#txt})) # mise en format sur 8 caractere de l'adresse et affichage k="" for (( x=0; x<$r ; x=$(($x+1)) )) do k="$k""0" done txt="$k""$txt" # Met txt sur 8 digits # # Affichage de la 3eme colonne # p=${cv3:$(($car1 * 16)):16} j=${#p} # traitement specifique d'un ligne avec moins de 16 bytes if [ $j -lt 16 ] then for (( y=0; y<$((16-$j));y=$(($y+1)) )) do temp="$temp"" " done fi # affichage de la 3eme colonne echo "$txt $temp |${cv3:$(($car1 * 16)):16}|" done # pour la toute derniere ligne, traitement specifique # si le nombre de bytes du fichier n'est pas un multiple de 16 if [ $j -lt 16 ] then j=$(((((($car1-1))*16)) + $j)) j=`echo ""$j" "16" o p " | dc` # on met tous les caractères en minuscule j=`echo $j | sed 's/.*/\L&/'` r=$((8-${#j})) # mise en forme k="" for (( x=0; x<$r ; x=$(($x+1)) )) do k="$k""0" done j="$k""$j" # Met txt sur 8 digits echo "$j" fi else echo "Vous n'avez pas les droits sur le fichier." echo "Les droits doivent être (r,r,r)" fi else echo "Le fichier $1 n'existe pas." fi else echo "Donnez un nom de fichier en argument" fi