Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [Java] Patcher?

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    66

    [Java] Patcher?

    Salve,
    sarei interessato alla realizzazione di un'applicazione che si occupa di creare un file binario delle differenze (patch) a partire da due file binari.

    Ci ho già lavorato sopra, però vorrei sapere se avete qualche consiglio, o ad esempio visto del materiale su questo argomento che credo possa essere stato dibattuto in rete, ma di cui non ho trovato molto.





    Ciò a cui ho pesato è fare una lettura byte per byte dei due file di cui interessa creare la patch (ovviamente ai fini pratici questi due file sono tipicamente due versioni di un certo file, una versione più vecchia e l'altra più recente).
    Leggendo ciclicamente in modo sequenziale l'i-esimo byte del file1 e l'i-esimo byte del file2, si confronta i due byte letti, se non sono uguali allora devo memorizzare questa differenza individuata. Dunque nel file binario delle differenze (patch) faccio due scritture: il byte del file2 (nell'ipotesi che file2 sia il file più recente) e un numero che corrisponde alla posizione di quel byte nel file2.
    Il problema principale è stato quello di ottimizzare la scrittura del numero della posizione per non occupare troppo spazio sul disco.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Uhm... ci sono un po' di casi da tenere in considerazione. Se i due file differiscono semplicemente per qualche byte (nel senso che alcuni byte nel file 1 devono essere sostituiti da quelli corretti presenti nel file 2) la cosa può anche funzionare. Graficamente:
    codice:
    Sostituzione di un byte:
    
    FILE 1: XXXXXYXXXXX
    FILE 2: XXXXXZXXXXX
    Ma se, ad esempio, il file 1 è identico al file 2 fino ad un certo byte, dopodichè non deve essere sostituito un byte, ma semplicemente inserito in mezzo e la restante parte del file va bene, la cosa è un po' più complessa. Graficamente:
    codice:
    Inserimento di un byte:
    
    FILE 1: XXXXXXXYYYYYYYY
    FILE 2: XXXXXXXBYYYYYYYY
    Se noti, tutti i byte successivi a quello inserito risulteranno differenti (perchè shiftati).

    Per questi ed altri casi è necessario assumere strategie diverse.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    avevo fatto un diff con stringhe di testo e credo che il principio sia uguale
    se hai una stringa "che figata" e una "una gran figata" con la tua idea le stringhe sono diverse dal primo all'ultimo carattere
    io ho fatto una roba tipo
    suddividere le stringhe in token, avevo preso le ,;() e altri come separatori, confrontare i token, quando ne trovo uno diverso devo continuare nella prima stringa a cercare il token della seconda, se non lo trovo cerco nella seconda quello della prima, quando trovo la corrispondenza continuo a cercare nelle due stringhe partendo dalle nuove posizioni

    credo di essere stato abbastanza oscuro

    st1 = "ciao, io programmo in java"
    st2 = "ciao, questo pomeriggio io programmo in java"

    imposto come separatore il char " "

    ciao = ciao ok
    io != questo (poffarbacco, ho trovato una differenza)
    blocco st1 e confronto con st2
    io != pomeriggio
    io = io (bene, adesso riparto con la st1)
    programmo = programmo
    in = in
    java = java

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2000
    Messaggi
    66
    Ciao, grazie mille per i consigli.


    Al di là di come realizzare l'algoritmo per individuare blocchi di byte uguali ma disallineati, ho qualche perplissità in fase di applicazione della patch creata.
    Molto probabilmente mi sfugge qualche nozione di java, però per quello che ne so, se dalla patch devo inserire n byte nel file di destinazione, una scrittura di n byte sovrascrive n byte quindi se li voglio far shiftare devo riscrivere l'intero file. [A meno che non esista un'altro metodo] :master:
    Potrebbe essere problematico visto che ho a che fare con file di svariate decine di Mbyte.


    Ciao.

  5. #5
    Anche se esistesse un metodo Java che permette di "shiftare", a livello fisico l'operazione e' cmq di riscrittura (non sono a conoscenza di file system che implementano funzionalita' atte a supportare questa caratteristica, e cmq Java deve essere compatibile con qualsiasi file system, quindi anche se esistesse...)

    In pratica ti conviene creare un file temporaneo in cui costruisci il file patchato. Questo risolve il problema. Se tutto va a buon fine, dopo lo sostituisci a quello originario.
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    E' per questo che molti patcher richiedono un minimo di spazio libero su disco: proprio per effettuare questa "copia di riserva" ed eventualmente salvare le copie di backup.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    Originariamente inviato da floyd
    avevo fatto un diff con stringhe di testo e credo che il principio sia uguale
    se hai una stringa "che figata" e una "una gran figata" con la tua idea le stringhe sono diverse dal primo all'ultimo carattere
    io ho fatto una roba tipo
    suddividere le stringhe in token, avevo preso le ,;() e altri come separatori, confrontare i token, quando ne trovo uno diverso devo continuare nella prima stringa a cercare il token della seconda, se non lo trovo cerco nella seconda quello della prima, quando trovo la corrispondenza continuo a cercare nelle due stringhe partendo dalle nuove posizioni

    credo di essere stato abbastanza oscuro

    st1 = "ciao, io programmo in java"
    st2 = "ciao, questo pomeriggio io programmo in java"

    imposto come separatore il char " "

    ciao = ciao ok
    io != questo (poffarbacco, ho trovato una differenza)
    blocco st1 e confronto con st2
    io != pomeriggio
    io = io (bene, adesso riparto con la st1)
    programmo = programmo
    in = in
    java = java

    ehmmm... sto facendo proprio questo lavoro...
    non mi è chiaro, riesci a darmi una mano ????

    o meglio... mi sono perso in questo punto...

    "se non lo trovo cerco nella seconda quello della prima, quando trovo la corrispondenza continuo a cercare nelle due stringhe partendo dalle nuove posizioni"
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.