Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    12

    [PHP] successione di valori esadecimali in una stringa

    Ciao a tutti!
    Partendo da un array di interi, vorrei recuperare una stringa contenente la successione dei corrispondenti numeri convertiti in esadecimale. Per esempio, dato l'array

    $i = array (0,29,96);

    voglio ricavare

    $str = "\x00\x1c\x27";

    Io ho fatto :
    Codice PHP:
    $i = array (02996); 
    $f 0
    $string ""
    $str ""

    while (
    $f != ){ 
    $str dechex($i[$f]); 
    $string. = $str;
    $f++; 

    echo 
    $string
    che mi produce in output "001c27" come stringa e non come successione di numeri "\x00\x1c\x27".

    Una mano?

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    intanto i numeri esadecimali normalmente si rappresentano con 0xNN e non con \xNN.

    poi tu vuoi che ti restituisca "\x00\x1c\x27" al posto di "001c27. Sono entrambe stringhe (non capisco che tipo di dato dovrebbe essere secondo te una "successione di numeri"), quindi non vedo il problema. Fai $string. = '\x'.$str nel tuo codice e otterrai una stringa "\x00\x1c\x27"

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    12
    Innanzi tutto grazie per la risposta

    Lo so che il dato è sempre una stringa...ma volevo spiegare che il mio problema è che la stringa non viene riconosciuta come formata da una successione di numeri esadecimali.

    Comunque quella è la prima cosa che ho provato a fare...il problema è che alla fine ottengo "\x00\x1c\x27" ma non mi riconosce i singoli valori (0x00, 0x1c....) come rappresentazione esadecimale ma la stringa è vista come la successione dei caratteri "\" "x" "0" "0" etc etc...

    Per fare una prova pratica ho provato a fare una comparazione

    Codice PHP:
    $i = array (02996); 
    $f 0
    $string ""
    $str ""
    $str1 "\x00\x1c\x27"
    while (
    $f != ){ 
    $str dechex($i[$f]); 
    $string. = '\x'.$str
    $f++; 

    echo 
    $string
    if(
    $str1 == $string
    echo 
    "OK!"
    else 
    echo 
    "NO!"
    Nel caso di $str1, la stringa viene riconosciuta come costituita dei valori esadecimali (primo carattere: 0x00; secondo carattere: 0x1c; terzo carattere: 0x27), mentre nel caso di $string, nonostante formalmente sia identica a $str1, questa viene trattata come stringa di caratteri (e quindi il \x non viene interpretato come carattere identificativo della rappresentazione esadecimale)
    Ovviamente, quindi, l'output è "NO!"

    Spero di essermi spiegato

    P.S.:hem....nel codice il \ non viene visualizzato...ma fidatevi che c'è

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    12
    Ho risolto, grazie
    Mi è venuta l'ispirazione proprio mentre scrivevo il post precedente...basta usare la funzione chr per avere la sequenza dei caratteri corrispondenti al valore esadecimale...soluzione semplice ed indolore..

    Grazie ancora

  5. #5
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Hai le idee un po' confuse, e quel codice non si puo' guardare

    Intanto, come ho gia' detto, un numero esadecimale NON viene rappresentato con \xNN, ma con 0xNN.
    \xNN e' la rappresentazione esadecimale del carattere ascii, non il numero stesso!
    ad esempio il numero 9 in esadecimale e' 0x09. Mentre la rappresentazione esadecimale del carattere ascii 9 e' \x30. Sono due cose diverse, non confonderle.

    E poi non ho capito veramente quale sia il tuo compito.
    Vedere se un array di numeri e' uguale ad una stringa con numeri esadecimali concatenati?

    Ti conviene avere anche la seconda cosa sotto forma di array.

    Ad esempio:

    Codice PHP:
    <?php
    $arr1 
    = array(0,29,96);
    $arr2 = array(0x00,0x1d,0x60);
    if(
    $arr1 == $arr2){
        echo 
    "sono uguali";
    }else{
        echo 
    "non lo sono";
    }
    ?>

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Ho visto che hai gia' risolto cmq leggendo il thread mi soo accorsto di 1 altra cosa ,
    devi fare attenzione a come usi il carattere "\" e' il carattere di escape e se lo inserisci un una stringa che inizia con il doppio apice esso verra' espanso e il carattere successivo verra' considerato come singolo carattare.

    Basta una semplice prova
    echo " \" " ;
    echo ' \" ' ;

    Vedrai subito la differenza di comportamento. Inoltre hai la funzione implode($separator,$array) per convertire una array in una stringa con separtatore da te deciso.


    Ciauz.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    12
    Sì, sapevo la differenza...

    In pratica tutto il problema è sorto dal fatto che, dovendo partire con l'input di una stringa contenente caratteri in notazione hex, tipo "1a4d3f", e volendo ottenere la stringa costituita dai caratteri corrispondenti, mi ero fissato con la notazione esadecimale...in realtà (cosa che poi ho fatto) era molto più semplice prendere a due a due i caratteri della stringa iniziale (1a 4d 3f) convertirli in int (ottenendo quindi il codice ascii corrispondente) e copiarli in una stringa in modo da avere, invece che la loro rappresentazione esadecimale, i caratteri veri e propri...forse è un po' incasinato il mio ragionamento ma ha una sua logica, ve l'assicuro

    Se può servire a qualcuno potrei tentare di spiegarmi meglio e/o postare il codice...

  8. #8
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Originariamente inviato da MrHahn
    Sì, sapevo la differenza...

    In pratica tutto il problema è sorto dal fatto che, dovendo partire con l'input di una stringa contenente caratteri in notazione hex, tipo "1a4d3f", e volendo ottenere la stringa costituita dai caratteri corrispondenti, mi ero fissato con la notazione esadecimale...in realtà (cosa che poi ho fatto) era molto più semplice prendere a due a due i caratteri della stringa iniziale (1a 4d 3f) convertirli in int (ottenendo quindi il codice ascii corrispondente) e copiarli in una stringa in modo da avere, invece che la loro rappresentazione esadecimale, i caratteri veri e propri...forse è un po' incasinato il mio ragionamento ma ha una sua logica, ve l'assicuro

    Se può servire a qualcuno potrei tentare di spiegarmi meglio e/o postare il codice...
    Prendere i caratteri due a due non e' sempre la migliore delle idee, ad esempio avresti problemi con roba tipo ìèàù in modalita' unicode.

    La cosa migliore da fare e' questa:
    supponiamo che tu hai un input "4d724861686e". E vuoi controllare se e' uguale alla stringa "MrHahn".
    Basta fare cosi':
    Codice PHP:
    if(pack('H*','4d724861686e') == 'MrHahn'){
         echo 
    'uguale';


  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    12
    Il compito dello script non è fare il confronto tra le stringhe...mi serviva recuperare l'md5 della stringa dei caratteri (di cui in input avevo la rappresentazione esadecimale) per poi manipolarla in un certo modo.
    Il confronto che ho fatto prima era solo un "test" per controllare che effettivamente le due stringhe erano diverse

  10. #10
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    L'idea e' sempre quella, md5(pack('H*','4d724861686e'));

    Ti spiego meglio il problema del tuo approccio: il carattere "è" utf8 in esadecimale e' c3a8
    Se tu prendi la stringa 2 caratteri alla volta, non otterai da c3a8 indietro 1 carattere è, ma otterrai 2 caratteri nuovi.
    Pero' se non avrai mai in input caratteri non-ascii, allora il problema non si pone, puoi continuare a prenderli 2 alla volta

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 © 2025 vBulletin Solutions, Inc. All rights reserved.