Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Codificatore - Due parole di presentazione

Codificatore

Sommario | Admin | Forum | Bugs | Todo | Files

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 0:49
Venerdì, 30/01/2015
All'avvio, il programma legge del testo dagli appunti di Windows e lo tiene in memoria per usarlo come chiave per criptare un file tramite il pulsante "Carica un file .txt da codificare..." o per decriptare un file tramite il pulsante "Carica un file .txt da decodificare...".

Un file .txt o .cdf può essere caricato anche direttamente all'avvio tramite "drag and drop" sull'icona del programma. In questo caso, il programma riconosce il tipo di file basandosi sulla sua estensione.

La chiave per la criptazione può essere ricaricata usando il pulsante "Aggiorna la chiave".

Se la chiave non è idonea alla criptazione del testi contenuto nel file da criptare, viene mostrato un messaggio d'errore e nel campo "Caratteri mancanti nella chiave:" viene visualizzato un elenco delle mancanze alle quali occorre far fronte.

Quando la chiave è stata correttamente caricata dagli appunti e il testo da criptare è stato correttamente caricato da file, si può procedere col processamento tramite il pulsante "Codifica il file caricato" o il pulsante "Decodifica il file caricato".

Il file risultante dal processamento viene salvato nella stessa directory ove si trova il file originale, con lo stesso nome ma estensione differente. Il file che risulta da una decriptazione riceve l'estensione .txt; il file che risulta da una criptazione riceve l'estensione .cdf (come [c]o[d]i[f]icato).

NOTA: il file in uscita viene registrato usando fopen() con privilegi d'accesso "w+", per cui un eventuale file esistente con lo stesso nome viene sovrascritto senza preavviso (ammetto che si tratta di una caratteristica migliorabile).

E' IL PRIMO PROGETTO CHE PROPONGO SU PIEROTOFY.IT E NON SONO UN PROGRAMMATORE ESPERTO -- SI VEDE E NE SONO CONSAPEVOLE. SONO MOLTO GRADITI CRITICHE COSTRUTTIVE, INTEGRAZIONI, CONSIGLI, INSEGNAMENTI.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
marco_ (Normal User)
Newbie


Messaggi: 2
Iscritto: 30/01/2015

Segnala al moderatore
Postato alle 14:50
Venerdì, 30/01/2015
Non ho guardato molto il codice, comunque se vuoi un paio di critiche(da parte di un ciaffo):

Usi il c++ come se fosse c, prova ad utilizzare un po' gli oggetti, ad evitare variabili globali e funzioni con nomi eccessivamente lunghi come "InizializzaListaCaratteriMancanti".

Invece di usare le winapri prova framework come Qt. Inoltre nuovo standard del c++ ha delle cose ""carine"" per evitare problemi con malloc/free & co, potresti darci un'occhiata.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 15:17
Venerdì, 30/01/2015
Secondo il mio parere mischiare codice dipendente dal SO con l'algoritmo è orribile, vedi bool CompletaCaricamentoDati( HWND hwnd, int tipoDati );
e altre 2 o 3. Detto questo ho scoperto che quando premo ricarica chiave non mi avverte che la chiave non è valida, ma lo dice quando provo a cifrare il txt. Le Qt personalmente non le uso perchè non mi piace la licenza. Personalmente penso che se implementassi il tuo algoritmo in una o più classi il programma risulterebbe più facile da leggere e da portare su altri sistemi operativi. Potresti lasciare un romanzo di prova insieme al programma, non ho voglia di cercarne uno :D . Comunque l'algoritmo mi sembra abbastanza robusto, io fossi in te preparerei tutto il necessario per fare delle prove relative alla velocità dell'algoritmo, perchè secondo me non è performante.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:56
Venerdì, 30/01/2015
Testo quotato

Postato originariamente da marco_:Usi il c++ come se fosse c, prova ad utilizzare un po' gli oggetti, ad evitare variabili globali e funzioni con nomi eccessivamente lunghi come "InizializzaListaCaratteriMancanti".

Invece di usare le winapri prova framework come Qt. Inoltre nuovo standard del c++ ha delle cose ""carine"" per evitare problemi con malloc/free & co, potresti darci un'occhiata.



Sì, sono critiche sensate. Ho usato intenzionalmente il C++ come se fosse C, sostanzialmente perché...

1. la mia dimestichezza con le caratteristiche avanzate del C++ è piuttosto rudimentale e mi porta facilmente "a perdermi"
2. in questa prima fase non mi sono venute in mente situazioni nelle quali creare oggetti mi potesse essere particolarmente utile (il programma è piccino), anche se riconosco che le cose potrebbero cambiare nel corso dello sviluppo
3. le variabili globali, effettivamente, potrebbero essere "incapsulate" come proprietà negli oggetti... quando e se inserirò il ricorso agli oggetti; non usare variabili globali in assenza d'oggetti m'ha dato l'impressione di far lievitare eccessivamente il passaggio dei parametri da una funzione all'altra, generando una certa confusione per me che sono poco esperto
4. i nomi lunghi mi servono per non perdere il senso di quel che sto facendo; non è escluso che in una fase successiva dello sviluppo uno possa creare una documentazione per riportare il senso effettivo di nomi di funzioni abbreviati nel codice (è una correzione piuttosto veloce, in un programmino come questo); un'altra ragione per i nomi lunghi è data dalla mia ostinazione nel non voler usare, per puro campanilismo, nomi in inglese (InitMissingCharsList è più sintetico di InizializzaListaCaratteriMancanti)

La scelta di usare direttamente le API di Win32 è dovuta al fatto che preferisco andare alla "base" delle cose; a ragione o a torto, mi sembra d'avere più controllo su quel che faccio.

Malloc() e free() li ho usati per una ragione che è senz'altro puerile nel contesto dei PC attuali, con memorie di massa nell'ordine dei TB e memorie RAM di alcuni GB: il file dell'eseguibile è circa 45KB più "snello" senza new/delete.

Grazie delle critiche. Terrò conto di tutte per vedere se possono portare a delle migliorie.
Tu che classi creeresti in un programma del genere? Con quali finalità?


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 16:13
Venerdì, 30/01/2015
Io creerei una o due classi: una per il cifratore, una per il decifratore oppure una che fa entrambe le cose.

Il costruttore di entrambe le classi potrebbe avere come parametro la stringa usata come chiave.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 16:14
Venerdì, 30/01/2015
Testo quotato

Postato originariamente da TheDarkJuster:

Secondo il mio parere mischiare codice dipendente dal SO con l'algoritmo è orribile, vedi bool CompletaCaricamentoDati( HWND hwnd, int tipoDati );



Ecco, questo mi interessa particolarmente. Ti riferisci alla presenza di InvalidateRect()? Sarebbe più opportuno usare una funzione accessoria tipo InvalidaFinestra(HWND hwnd, RECT *r)? Non credo tu intendessi questo, perché rimarrebbe il fatto che anche HWND e RECT sono dipendenti dal sistema operativo. Dovrei creare delle strutture dati personalizzate e inglobarci HWND e RECT così che se si dovesse decidere di cambiare sistema operativo basterebbe cambiare quelle strutture personalizzate in un unico posto? Addirittura, secondo quanto ha scritto marco_, potrebbe essere il caso di creare delle classi che inglobino solo ed esclusivamente gli elementi d'interfaccia legati al sistema operativo? In un programma tanto piccolo sarebbe conveniente?

Testo quotato

Postato originariamente da TheDarkJuster:
ho scoperto che quando premo ricarica chiave non mi avverte che la chiave non è valida, ma lo dice quando provo a cifrare il txt.



Sai cosa credo che tu abbia notato? Che se carichi una chiave dagli appunti senza avere già caricato un testo da codificare la verifica non può avere luogo. Infatti la verifica della chiave consiste nell'accertamento del fatto che nella chiave siano presenti almeno una volta tutti i caratteri presenti nel testo da codificare. Se il testo da codificare non è ancora stato caricato, non c'è niente da verificare e tutte le chiavi sono virtualmente valide.

Testo quotato

Postato originariamente da TheDarkJuster:
Personalmente penso che se implementassi il tuo algoritmo in una o più classi il programma risulterebbe più facile da leggere e da portare su altri sistemi operativi.



Faccio anche a te la stessa domanda: classi con che finalità e con che caratteristiche? Consigli? Brancolo nel buio.

Testo quotato

Postato originariamente da TheDarkJuster:Potresti lasciare un romanzo di prova insieme al programma, non ho voglia di cercarne uno :D .



L'idea del romanzo è giusto una delle possibilità. Ho previsto il caricamento della chiave dagli appunti anziché da un file proprio perché volevo che la chiave potesse provenire dalle fonti più svariate. Ad esempio, uno potrebbe voler usare una pagina web: la apri, la copi negli appunti, la usi direttamente come chiave.

Testo quotato

Postato originariamente da TheDarkJuster:Comunque l'algoritmo mi sembra abbastanza robusto, io fossi in te preparerei tutto il necessario per fare delle prove relative alla velocità dell'algoritmo, perchè secondo me non è performante.



SICURAMENTE non è performante. Non credo di avere le conoscenze teoriche necessarie per ottimizzare un algoritmo, ma proverò a ragionarci. In ogni caso non credo che la velocità d'elaborazione sia così determinante in un programma con finalità limitate come codificare brevi messaggi che, al più, richiedono il trattamento di poche centinaia di caratteri.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 16:17
Venerdì, 30/01/2015
Testo quotato

Postato originariamente da TheDarkJuster:

Io creerei una o due classi: una per il cifratore, una per il decifratore oppure una che fa entrambe le cose.

Il costruttore di entrambe le classi potrebbe avere come parametro la stringa usata come chiave.



Allora, se ho ben capito, l'utilità del ricorso alle classi ha carattere più che altro formale, sarebbe come creare un programma nel programma. Forse lo scopo è proprio quello di separare l'area del programma che si occupa dell'interfaccia (tipicamente legata al sistema operativo) dall'area che si occupa delle funzioni dedicate (la codifica e la decodifica)?


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 16:32
Venerdì, 30/01/2015
Si, sarebbe una organizzazione diversa, ma a mio parere migliore, renderà l'eseguibile più grande e probabilmente perderai un po' di tempo in esecuzione ma sono cose trascurabili. Comunque io mi riferivo al fatto che un metodo che è parte dell'algoritmo utilizza tipi di dato come HWND o comunque facenti parte delle win32 api.

potresti organizzare in questo modo la classe

Codice sorgente - presumibilmente C#

  1. class Cifratore {
  2.     public:
  3.         Cifratore(string chiaveDaCopiare);
  4.         void NuovaChiave(string nuovaChiave);
  5.         ... Cifra(string testo);
  6.         string Decifra(...);
  7.         bool ControllaValiditaChiave(string testo);
  8.  
  9.     private:
  10.         string chiave;
  11. };


PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 16:44
Venerdì, 30/01/2015
D'accordo. Bei consigli. Tra domani e domenica ci metterò mano per vedere come riuscire a scombinare tutto quanto con la mia imbranataggine (tanto, prima di fare modifiche, faccio sempre una copia delle vecchie versioni funzionanti, mica son fesso!) :)

Grazie.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo