!
program indaesadecimale ! ! Usa, se lo trova, il file indaesadecimaleini.txt ! e potrebbe operare su diversi file di ingresso, ! altrimenti legge un unico file di ingresso scelto ! tramite la tastiera... ! ! Converte un qualsiasi file binario in esadecimale usando ! come cifre i caratteri Unicode da 192 a 207 ossia dei ! caratteri di testo rarissimamente usati nei documenti ! di testo. ! ! Quando decodifica ignora qualsiasi carattere ad eccezione ! dei caratteri Unicode tra 192 e 208 per cui, in pratica, ! diventa possibile realizzare un file HTML fatto di caratteri ! che non interferiscono con quelli, insoliti, usati dalla ! codifica esadecimale... ! ! Se trova il carattere 208 in fase di decodifica chiude ! il file che stava scrivendo e ne apre un altro. ! ! Il primo file che crea decodificando ha estensione .x2345 ! l'eventuale secondo .x2346 e cosi' via... ! ! Se usa il file di inizializzazione l'estensione deve essere scelta ! ossia potrebbe essere .y2345 o .z2345 ( la parte numerica viene ! comunque sempre gestita dal programma ) ! ! In sintesi un qualsiasi documento HTML potrebbe "veicolare" un ! qualsiasi insieme di file di qualsiasi tipo binario. ! implicit none logical:: lotrovo integer:: k,no,kodifico character(len=4) sno character(len=128) nomef nomef="indaesadecimaleini.txt" inquire(file=nomef(1:len_trim(nomef)),exist=lotrovo) if(lotrovo) then write(unit=*,fmt=*)"Digita 1 per usare "//nomef(1:len_trim(nomef)) read(unit=*,fmt=*) k if(k/=1) then nomef="indaesadecimaleinu.txt" inquire(file=nomef(1:len_trim(nomef)),exist=lotrovo) end if else nomef="indaesadecimaleinu.txt" inquire(file=nomef(1:len_trim(nomef)),exist=lotrovo) end if write(unit=*,fmt=*)"Digita 0 per operare COMUNQUE manualmente" read(unit=*,fmt=*) k if(k==0) then lotrovo=.false. end if if(lotrovo) then write(unit=*,fmt=*) "Pilotato dal file "//nomef(1:len_trim(nomef)) open(unit=11,file=nomef(1:len_trim(nomef)),status="old",action="read") read(unit=11,fmt=*,iostat=no) kodifico if(no/=0) then write(unit=*,fmt=*) "Errore di lettura dal file "//nomef(1:len_trim(nomef)) write(unit=*,fmt=*) write(unit=*,fmt=*) "La prima riga deve contenere un intero" write(unit=*,fmt=*) "Se l'intero vale 1 codifica altrimenti decodifica" write(unit=*,fmt=*) "Se codifica, in ogni riga seguente usa ..." write(unit=*,fmt=*) " il nome del file da codificare, tra doppi apici" write(unit=*,fmt=*) "Se decodifica, in ogni riga seguente contiene due dati :" write(unit=*,fmt=*) " 1) il nome del file da decodificare, tra doppi apici" write(unit=*,fmt=*) " 2) l'estensione dei file generati, tra doppi apici" else if(kodifico==1) then cod:do k=1,9999 read(unit=11,fmt=*,iostat=no) nomef if(no/=0) then exit cod end if call codifica(nomef(1:len_trim(nomef))) end do cod else decod:do k=1,9999 read(unit=11,fmt=*,iostat=no) nomef,sno if(no/=0) then exit decod end if sno(1:1)="." call decodifica(nomef(1:len_trim(nomef)),sno(1:len_trim(sno))) end do decod end if end if else ! write(unit=*,fmt=*)"Codificatore e Decodificatore in cifre esadecimali" write(unit=*,fmt=*)"Usa il file pilotaggio : indaesadecimaleini.txt" write(unit=*,fmt=*)"e se non lo trova tenta di usare indaesadecimaleinu.txt" write(unit=*,fmt=*)" " write(unit=*,fmt=*)"Converte un qualsiasi file binario in esadecimale usando" write(unit=*,fmt=*)"come cifre i caratteri Unicode da 192 a 207 ossia dei" write(unit=*,fmt=*)"caratteri di testo rarissimamente usati nei documenti" write(unit=*,fmt=*)"di testo." write(unit=*,fmt=*)"Quando decodifica ignora qualsiasi carattere ad eccezione" write(unit=*,fmt=*)"dei caratteri Unicode tra 192 e 208 per cui, in pratica," write(unit=*,fmt=*)"diventa possibile realizzare un file HTML fatto di caratteri" write(unit=*,fmt=*)"che non interferiscono con quelli, insoliti, usati dalla" write(unit=*,fmt=*)"codifica esadecimale." write(unit=*,fmt=*)" " write(unit=*,fmt=*)"Se trova il carattere 208 in fase di decodifica chiude" write(unit=*,fmt=*)"il file che stava scrivendo e ne apre un altro." write(unit=*,fmt=*)" " write(unit=*,fmt=*)"Il primo file che crea decodificando ha estensione .x2345" write(unit=*,fmt=*)"l'eventuale secondo .x2346 e cosi' via..." write(unit=*,fmt=*)" " write(unit=*,fmt=*)"Giampaolo Bottoni : versione 4 aprile 2012" write(unit=*,fmt=*)" " write(unit=*,fmt=*)"Digita 1 se vuoi codificare, altrimenti decodifica" read(unit=*,fmt=*) kodifico if(kodifico==1) then write(unit=*,fmt=*)"Trasforma in esadecimale" write(unit=*,fmt=*)"Genera un file con estensione .txt" call codifica("0") else write(unit=*,fmt=*)"Decodifica usando solo i caratteri esadecimali" write(unit=*,fmt=*)"Genera file con estensione .x234#" call decodifica("0",".x") end if end if write(unit=*,fmt=*)"Ha finito. Un invio..." read(unit=*,fmt=*) stop ! contains ! subroutine codifica(nome) character(len=*),intent(in)::nome character(len=1)::bit8 character(len=2)::dueb character(len=256)::nomefile,riga integer::nf,j,k,nstato,m,r,diagnostico,diagnosticw integer::nbit,nbit1,nbit2,kk,kkk logical::esiste ! write(unit=*,fmt=*)"Digita il nome del file da trasformare in esadecimale" do j=1,3 if(len_trim(nome)>3) then nomefile=nome if(j>1) then exit end if else read(unit=*,fmt="(1a)") nomefile endif nf=len_trim(nomefile) if(1>nf ) then exit end if write(unit=*,fmt=*)"Cerco ",nomefile(1:nf) inquire(file=nomefile(1:nf),exist=esiste) if(esiste) then write(unit=*,fmt=*)"Apertura riuscita" open (unit=12,file=nomefile(1:nf),access="direct",form="unformatted", & recl=1,status="old",action="read") open (unit=13,file=nomefile(1:nf)//".txt",access="direct",form="unformatted", & recl=2,status="replace",action="write") kk=3 kkk=0 dueb=char(60)//char(33) write(unit=13,rec=1,iostat=diagnosticw) dueb dueb="--" write(unit=13,rec=2,iostat=diagnosticw) dueb dueb=char(13)//char(10) write(unit=13,rec=3,iostat=diagnosticw) dueb carico2:do k=1,999999999 read(unit=12,rec=k,iostat=diagnostico) bit8 if(diagnostico/=0) then write(unit=*,fmt=*)"Ha letto ",k," caratteri." exit carico2 else nbit=ichar(bit8) nbit1=nbit/16 nbit2=nbit-16*nbit1 dueb=char(192+nbit1)//char(192+nbit2) kk=kk+1 write(unit=13,rec=kk,iostat=diagnosticw) dueb if(diagnosticw/=0) then write(unit=*,fmt=*)"Errore scrittura a ",kk," avendo letto ",k exit carico2 end if kkk=kkk+1 if(kkk>35) then kkk=0 dueb=char(13)//char(10) kk=kk+1 write(unit=13,rec=kk,iostat=diagnosticw) dueb if(diagnosticw/=0) then write(unit=*,fmt=*)"Errore scrittura a ",kk," avendo letto ",k exit carico2 end if end if end if end do carico2 close(12) kk=kk+1 dueb=char(13)//char(10) write(unit=13,rec=kk,iostat=diagnosticw) dueb kk=kk+1 dueb="--" write(unit=13,rec=kk,iostat=diagnosticw) dueb kk=kk+1 dueb=char(62)//char(32) write(unit=13,rec=kk,iostat=diagnosticw) dueb close(13) write(unit=*,fmt=*)"Chiusura riuscita di "//nomefile(1:nf)//".txt" exit else write(unit=*,fmt=*)"Non trovo ",nomefile(1:nf) write(unit=*,fmt=*)"...altro tentativo..." end if end do return end subroutine codifica ! subroutine decodifica(nome,sno) character(len=*),intent(in)::nome,sno character(len=1)::bit8,dueb character(len=4)::estendo character(len=256)::nomefile,riga integer::nf,j,k,nstato,m,r,diagnostico,diagnosticw integer::nbit,nbit1,bene,kk,numero logical::esiste ! write(unit=*,fmt=*)"Digita il nome del file da decodificare" do j=1,3 if(len_trim(nome)>3) then nomefile=nome if(j>1) then exit end if else read(unit=*,fmt="(1a)") nomefile endif nf=len_trim(nomefile) if(1>nf ) then exit end if write(unit=*,fmt=*)"Cerco ",nomefile(1:nf) inquire(file=nomefile(1:nf),exist=esiste) if(esiste) then write(unit=*,fmt=*)"Apertura riuscita" bene=1 kk=0 numero=2345 write(unit=estendo,fmt="(1I4)") numero open (unit=12,file=nomefile(1:nf),access="direct",form="unformatted", & recl=1,status="old",action="read") open (unit=13,file=nomefile(1:nf)//sno//estendo,access="direct", & form="unformatted",recl=1,status="replace",action="write") carico2:do k=1,999999999 read(unit=12,rec=k,iostat=diagnostico) bit8 if(diagnostico/=0) then write(unit=*,fmt=*)"Ha letto ",k," caratteri." exit carico2 else nbit=ichar(bit8) if(nbit>191) then if(208>nbit) then bene=-bene if(bene>0) then dueb=char(nbit1*16+nbit-192) kk=kk+1 write(unit=13,rec=kk,iostat=diagnosticw) dueb if(diagnosticw/=0) then write(unit=*,fmt=*)"Errore scrittura al carattere ",kk exit carico2 end if else nbit1=nbit-192 end if else if(nbit==208) then ! Chiude il file e ne apre un altro close(13) numero=numero+1 write(unit=*,fmt=*)"Apre il file ",numero write(unit=estendo,fmt="(1I4)") numero open (unit=13,file=nomefile(1:nf)//sno//estendo,access="direct", & form="unformatted",recl=1,status="replace",action="write") kk=0 end if end if end if end do carico2 close(12) close(13) write(unit=*,fmt=*)"Chiusura riuscita file con estensione "//sno//estendo exit else write(unit=*,fmt=*)"Non trovo ",nomefile(1:nf) write(unit=*,fmt=*)"...altro tentativo..." end if end do return end subroutine decodifica ! end program indaesadecimale !