Pagina 1 di 1

Modificare file hex

Inviato: mer ago 01, 2012 15:38
da zosty
Voglio modificare con un semplice script (senza scrivere un programma c...) un file in formato hex inserendo i corretti parametri prelevati da un altro file.

In particolare, il contenuto del file di partenza e' del tipo:
    ...
    :1000B000FA6A2D30E8300C0BF926BEEF04F0C6EFDB
    :1000C00004F0CAEF04F0CEEF04F0FA6A3E440E0BDF
    :1000D000F926000C030C050C0A0C1E0C3C0C780CC9
    :0400E000F00C12000E
    :0200E40000001A
    :100100003A26533A30FF000039FB873A06330000A5
    :100110003A02FF3A0DA900003A0A773A1521000089
    :100120003A11ED3A1C9700003A19653A240F000085
    :100130003A20DB3A2B8700003A46CB3A51757F7F55
    :100140003A1AA53A1FFB00003A1D3F3A22950000DB
    :100150003A1FDB3A252F00003A273B3A2C8F00004C
    :100160003A29D53A2F2900003A32833A37D700008E
    :100170003A38273A3D7D00003A1AA53A1FFB7F7FA7
    :10018000FFFF63511CCBD5448EBE473800B2B92B5C
    :1001900072A52B1FE4989D12568C0F06C87F81F91B
    :1001A0003A73F3ECAC6665E01E5AD7D3904D49C75D
    :1001B0000241BBBA74342DAEE6279FA1581B11959E
    :0201C000CA0E65
    ....

ed il contenuto del file dal quale voglio prelevare il blocco di dati e':
    :100100003A26733A311F000039FBA73A0653000024
    :100110003A031F3A0DC900003A0A973A1541000008
    :100120003A120D3A1CB700003A19853A242F000004
    :100130003A20FB3A2BA700003A46EB3A51957F7FD5
    :100140003A1AC53A201B00003A1D5F3A22B500005A
    :100150003A1FFB3A254F00003A275B3A2CAF0000CC
    :100160003A29F53A2F4900003A32A33A37F700000E
    :100170003A38473A3D9D00003A1AC53A201B7F7F26

Quello che dovrebbe fare lo script e' di sovrascrivere le righe del primo file con quelle del secondo file quando i primi 9 caratteri coincidono.
E' possibile?

Grazie
Zosty

Re: Modificare file hex

Inviato: ven ago 03, 2012 9:54
da 414N
Non è molto chiaro quello che chiedi, soprattutto perché usi terminologia tipica di un file di testo (righe, caratteri) quando i file sono binari.
Che cosa intendi per caratteri? Singoli byte? Coppie di byte?
Che cosa intendi per righe? Cosa devi effettuare di preciso? Una sovrascrittura totale del primo file col secondo o una sovrascrittura parziale (se il secondo file è più piccolo del primo)?

Re: Modificare file hex

Inviato: ven ago 03, 2012 9:56
da fgcl2k
414N ha scritto:Non è molto chiaro quello che chiedi, soprattutto perché usi terminologia tipica di un file di testo (righe, caratteri) quando i file sono binari.
Che cosa intendi per caratteri? Singoli byte? Coppie di byte?
Che cosa intendi per righe? Cosa devi effettuare di preciso? Una sovrascrittura totale del primo file col secondo o una sovrascrittura parziale (se il secondo file è più piccolo del primo)?

Stavo scrivendo una risposta "fotocopia" della tua ma mi hai battuto sul tempo :-)

Re: Modificare file hex

Inviato: ven ago 03, 2012 15:16
da zosty
Ok, cerco di spiegarmi meglio...spero di farcela! :)

I file sono file di testo ed ogni riga e' terminata dai caratteri 0x0d e 0x0a . Il secondo file e' piu' piccolo del primo.
Quello che vorrei fare e' sostituire le righe del primo file con quelle del secondo file se i primi 9 caratteri di ciascuna riga coincidono.
Per cui, considerando la prima riga del secondo file:

:100100003A26733A311F000039FBA73A0653000024

i primi 9 caratteri sono :10010000.

Ora, considerata questa stringa, la cerco all'inizio di ogni riga del primo file...se il risultato della ricerca e' positivo, voglio sostituire tutta la riga con la nuova riga.
Al termine di tutto, il file ottenuto dovrebbe essere:

...
:1000B000FA6A2D30E8300C0BF926BEEF04F0C6EFDB
:1000C00004F0CAEF04F0CEEF04F0FA6A3E440E0BDF
:1000D000F926000C030C050C0A0C1E0C3C0C780CC9
:0400E000F00C12000E
:0200E40000001A
:100100003A26733A311F000039FBA73A0653000024
:100110003A031F3A0DC900003A0A973A1541000008
:100120003A120D3A1CB700003A19853A242F000004
:100130003A20FB3A2BA700003A46EB3A51957F7FD5
:100140003A1AC53A201B00003A1D5F3A22B500005A
:100150003A1FFB3A254F00003A275B3A2CAF0000CC
:100160003A29F53A2F4900003A32A33A37F700000E
:100170003A38473A3D9D00003A1AC53A201B7F7F26
:10018000FFFF63511CCBD5448EBE473800B2B92B5C
:1001900072A52B1FE4989D12568C0F06C87F81F91B
:1001A0003A73F3ECAC6665E01E5AD7D3904D49C75D
:1001B0000241BBBA74342DAEE6279FA1581B11959E
:0201C000CA0E65
....

Spero di essermi spiegato...ma non ne sono molto sicuro! :doubt:

Re: Modificare file hex

Inviato: ven ago 03, 2012 15:50
da 414N
Se non ho capito male tu devi solo lavorare sull'output di testo prodotto da un qualche editor esadecimale per modificarne delle porzioni.
In tal caso, questo script che ho arrabbattato in quattro e quattr'otto dovrebbe fare al caso tuo:

Codice: Seleziona tutto

#!/bin/sh

if [ $# -ne 2 ]
then
   cat << EOF
Sostituisce le righe di file1 con quelle contenute in file2 che presentano
i medesimi 9 caratteri iniziali
Uso:
   $0 file1 file2
EOF
   exit 1
fi

FILE1="$1"
FILE2="$2"

# Ricavo il nome del file di output. Se FILE1 si chiama file1.txt, OUTFILE
# si chiamerà file1-PROC.txt.

OUTFILE="${FILE1%.*}-PROC.${FILE1##*.}"

# Copio FILE1 nell'output, in modo da modificare solo quello

cp "$FILE1" "$OUTFILE"

# Per ogni riga del secondo file...

while read F2LINE
do
   # ... ricavo i primi 9 caratteri della riga ...

   FIRST9=$(echo $F2LINE  |cut -c1-9)

   # ... e sostitituisco tutte le righe che iniziano con quei nove
   # caratteri con F2LINE in OUTFILE

   sed -i "s/^$FIRST9.*$/$F2LINE/g" "$OUTFILE"
done < "$FILE2"

# Se il file di output è stato modificato

if [ "$(diff "$FILE1" "$OUTFILE")" ]
then

   # lo comunico

   echo "Changes applied to $FILE1"
else

   # altrimenti, oltre a comunicarlo, rimuovo OUTFILE perchè tanto è
   # una copia di FILE1
   echo "Nothing changed in $FILE1"
   rm "$OUTFILE"
fi

L'ho testato sull'esempio che hai fornito e il risultato è proprio quello che hai riportato.

Re: Modificare file hex

Inviato: lun ago 06, 2012 9:39
da zosty
Esatto. Si tratta di modificare una parte di file ottenuto dopo aver compilato un progetto con dei dati di calibrazione specifici.

Ora provo lo script e ti faccio sapere! Anche io avevo pensato di ricorrere a sed...ma, ad essere onesto, non ne capisco molto! ;)

FUNZIONA PERFETTAMENTE!!! Ora me lo studio attentamente...

Grazie mille!!!!!!! =D>