Visualizzazione risultati 1 fino 8 di 8

Discussione: Stringhe numeriche troppo lunghe. Errore output

  1. #1
    Guest

    Predefinito Stringhe numeriche troppo lunghe. Errore output

    Ciao a tutti,
    Ho una piccola domanda.

    Sto progettando un sistema di login con cookie e purtroppo sono inciampato in un piccolissimo problema, ma che dannatamente persiste. Cripto una stringa numerica da 32 caratteri (tipo : 38472387958928374....) con una funzione che ho crato io, cmd(), e poi per sicurezza la mando con un base64_encode(). Ora, il mio problema è che quando vado a visualizzarla in output, decriptata sia con base64_decode() sia con la mia stessa funzione inversa, la stringa dovrebbe risultare visivamente così:

    Codice:
    7594759485768574023298
    Esce invece così:
    Codice:
    759475948576E+32
    Questo mi crea parecchi problemi, perché non posso più interagire con funzioni matematiche per criptarla. Anzi, quando, ad esempio, provo ad elevarla al quadrato con sqrt(), mi dà direttamente 'INF' come output e penso sia per quel 'E+' - anche se comunque mancherebbe parte della stringa. Immagino sia un modo per stringerla senza visualizzare tutta la pagina con numeri, ma come lo disattivo?
    Ultima modifica di andreahomepage : 23-08-2012 alle ore 17.06.34

  2. #2
    Guest

    Predefinito

    Quello è solo un modo di rappresentare le cifre e non influenza i calcoli.
    Ma poi sqrt è la RADICE quadrata non l'elevamento a potenza (^n).

  3. #3
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Per dirla tutta quella E+32 ti dovrebbe far capire due cose: che quel numero è un numero e non una stringa di numeri e che è talmente grosso da dover essere elaborato in virgola mobile (floating point) con conseguente perdita di precisione.
    Usare funzioni numeriche come la radice quadrata in questo caso comporta una perdita di informazioni. Quindi se lo cripti e lo decripti non ottieni il numerone originale. Ricorda che sei su un sistema a 32bit!


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Facendola molto sporca, un modo potrebbe essere quello di aggiungere un carattere non-numerico all'inizio della stringa numerica (magari una sorta di "somma di controllo", a garanzia di ulteriore sicurezza del tuo codice), prima di procedere alla codifica base64, che funziona anche con input di tipo stringa.

    Al momento della decodifica, dovrai ovviamente ricordarti di ignorare il primo carattere dell'output (o, nel caso fosse la "somma di controllo", di usarlo per verificare se il valore codificato è valido)...

    Stammi bene...
    Ultima modifica di dementialsite : 28-08-2012 alle ore 17.29.09
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Guest

    Predefinito

    Ringrazio tutti per la risposta, proverò ad aggiungere un numero all'inizio della stringa. Ma una cosa non l'ho ancora capita perfettamente: perché se lo criptassi e decriptassi non otterrei il numero originale? A parte che ho sbagliato funzione per elevarlo al quadrato, ma per quale motivo dovrei comunque perdere i dati?

    Ringrazio tutti per la pazienza,
    Andrea

  6. #6
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Perché l'aritmetica dei numeri in virgola mobile è soggetta ad errori di approssimazione, leggi per esempio http://en.wikipedia.org/wiki/Floatin...uracy_problems

  7. #7
    Guest

    Predefinito

    Ah, questo mi sfuggiva. Grazie Karl !

    Posso chiederti, allora, anzi chiedervi, un consiglio su come criptare stringhe alfanumeriche ? Perché con quelle alfanumeriche non potrei fare operazioni matematiche...

  8. #8
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Come ti ho scritto sopra, base64_encode() e base64_decode() funzionano anche (anzi, soprattutto) con dati di tipo stringa.

    Se vuoi aggiungere una tua "somma di controllo", questo è il modo più semplice: in fase di codifica, fai la somma delle singole cifre e dividi il risultato per 26, prendendo il resto della divisione. A questo resto fai corrispondere una lettera dell'alfabeto (0 = A, 1 = B, 2 = C, etc.) e aggiungila in testa alla stringa numerica, quindi procedi alla codifica base64.

    In decodifica, esegui prima il base64_decode della stringa. Quindi ricalcola allo stesso modo la somma di controllo sul risultato (escludendo, ovviamente, la prima lettera): se risulterà uguale a quella decodificata, allora puoi ritenere(*) che la stringa passata sia corretta.

    (*) in realtà è vero che una lettera non attesa corrisponde con certezza ad una trasmissione sbagliata, ma non il contrario...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •