Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Creazione di una stringa

    Salve,
    chiedo cortesemente un aiuto a chi è piu' esperto di me nella programmazione C.
    Dovrei leggere delle stringhe (memorizzata in un array bidimensionale, ogni riga corrisponde ad una stringa di valori), a due caratteri per volta.
    Ad esempio "C60008" dovrà essere letta due caratteri per volta e di questi devo farne una conversione in intero, nell'esempio C6=198;
    Devo infine crearmi un array monodimensionale, contenente tutti i nuovi valori interi convertiti, nell'esempio "19808".
    La difficoltà è quella di capire come fare ad interpretare due caratteri come uno solo...poi la conversione e il resto dovrei essere in grado di farle da me.
    Spero possiate essermi di aiuto quanto prima,
    ciao e grazie
    Giuseppe

  2. #2
    puoi crearti un piccolo buffer e copiarci i due caratteri, es:
    codice:
      char tmp_buff[3];
      strncpy(tmp_buff, src, 2);
      tmp_buff[2] = 0;
    in tmp_buff hai i due caratteri presenti in src.

  3. #3

    Ancora non ci siamo!!

    Grazie,
    ma non credo che questa sia la soluzione che cercavo.
    Il problema è interpretare due caratteri come uno solo....
    come dicevo nell'esempio di sopra, "C6", dovrei convertirlo in intero come "198" e non
    "126" (che è la conversione in intero di C=12 + 6=6).
    Nella soluzione propostami copio solamente i caratteri due per volta, quindi ad esempio i due caratteri "00" (zero-zero) che prendo dalla stringa, me li ritrovo nel nuovo array,ancora come "00", e non come "0".
    Nel caso non sia ancora chiaro, è come se due caratteri 1 e 2 della stringa, dovrei leggerli come dodici, e non come uno e due!
    Grazie, ciao!!!

  4. #4
    Stai chiedendo di fare una conversione dall'esadecimale?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Hai detto che il resto lo facevi te Comunque quello che cerchi è la conversione da hex a int e con il tmp_buf del mio esempio basta che fai:
    codice:
      unsigned char tmp_dec = (tmp_buf[0] - '0') * 16 + (tmp_buf[1] - '0');
    ottimizzando un poco:
    codice:
      s = "C60008";
      unsigned char tmp_conv[10];
      char *tmp_s;
      unsigned char *tmp_p = tmp_conv;
      memset(tmp_conv, 0, sizeof(tmp_conv));
      for( i = 0, tmp_s = s; i < strlen(s); i += 2)
      {
         *tmp_p = (tmp_s[0] - '0') * 16 + (tmp_s[1] - '0');
         tmp_p++;
         tmp_s += 2;
      }
    Prova un po' se va...l'ho scritto velocemente

  6. #6
    Bè, a dirla tutta, ho una stringa di valori che sono i dati che devo inserire in una EEPROM.
    In breve, ho aperto il file di testo che contiene questi dati come caratteri esadecimali,
    ho memorizzato ogni riga del testo come stringa e ora, di ogni stringa, devo prendere a due a due i caratteri perchè due caratteri rappresentano un byte di dato che devo inserire in una data locazione di memoria. Quindi la mia idea era quella di crearmi un unico buffer immagine della memoria, da sparare poi interamente nella memoria. Quindi si, ogni due caratteri char, devo fare una conversione esadecimale di tali caratteri (presi a due a due, quindi C6 è un unico numero, non C+6!)
    Grazie per essere così veloci nelle risposte, ciao ragazzi

  7. #7
    Opppssssss ho fatto una c.......
    Non va quello che ho scritto (troppo abituato alle conversioni da decimale)....puoi usare su tmp_buf strtoul(tmp_buf, NULL, 16)...oppure:
    codice:
    tmp_dec = (tmp_buf[0] >= 'A') && (tmp_buf[0] <= 'F') ? ((tmp_buff[0] - 'A') + 10) * 16: (tmp_buff[0] - '0') * 16;
    tmp_dec += (tmp_buf[1] >= 'A') && (tmp_buf[1] <= 'F') ? ((tmp_buff[1] - 'A') + 10) : (tmp_buff[1] - '0');
    E speriamo che vadi ora

  8. #8
    Con questa funzione

    fscanf (S19, "%1s%1d%2x%*3x%3x%s\n", id, type, numbyte, add, temp);

    mi memorizzo una stringa del file di testo....il campo dei dati su cui devo "tagliare" e convertire, è la stringa temp.
    Vi riporto questa info nel caso abbiate un suggerimento su come prendere in modo veloce direttamente due caratteri per volta dalla stringa di testo (interpretandoli però sempre come unico numero esadecimale)

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.