Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    8

    [c/c++]Funzione di codifica esadecimale

    Avrei bisogno di un aiuto, non uso abitualmente il c o il c++ ma nel linguaggio con cui lavoro non ho possibilita' semplice di fare quello che mi serve per cui ho deciso di creare una funzione, inglobarla in una dll e chiamarla cosi' come funzione esterna. Per la dll credo di aver capito come si compila, il problema che ho e' la funzione in se'. La funzione richiede una stringa fissa di 22 caratteri (anche con spazi) e dovrebbe restituire una stringa di 25 numeri esadecimali che ha una struttura fissa. Ipotizziamo per semplicita' che i 22 caratteri siano tradotti col valore FF (lo spazio se non sbaglio ). Ho poi due caratteri fissi uno all'inizio 02H e uno alla fine 03H corrispondenti al primo e al penultimo dei 25 valori, per ultimo ho il cosidetto carattere di controllo che e' il dato dall'operazione xor sui primi 24 caratteri. La mia stringa di ritorno dovra' essere quindi :"02FF....FF03BCC" dove
    BCC = 02^FF^.....^03 (se non ho sbagliato il simbolo di xor). Per chi non avesse gia' intuito dove devo arrivare, in pratica devo costruire un stringa di bytes da inviare via seriale .
    Grazie mille per l'aiuto!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma la stringa in uscita deve essere ASCII o binaria ...?

    E poi come fa a risultare BCC quell'operazione xor di n byte?

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    8
    La stringa deve essere ascii, cioe' deve essere proprio una sequenza di caratteri tipo "02FFFF...031D".
    Per quanto riguarda il carattere di controllo vi riporto un esempio:
    Se ho la stringa "0200040c0044534330303030312e4a504703" il carattere di controllo viene calcolato come
    0x02^0x00^0x04^0x0c^0x00^0x44^0x53^0x43^0x30 ^0x30^0x30^0x30^0x31^0x2e^0x4a^0x50^0x47^0x03
    cioe' il risultato di 0x02^0x00 viene poi usato nel complemento con 0x04 (il terzo valore) e cosi' via.
    Naturalmente i valori compresi tra 0x02 e 0x03 sono i codici esadecimali dei caratteri della mia stringa di input.
    Per chiarire meglio, anche se il formato della stringa finale non e' esattamente quello che devo avere io, vi do' questo link http://www.yk.rim.or.jp/~mamo/Comput.../detail-e.html che spiega il calcolo del cosidetto BCC. Attenzione pero' io non uso il valore 10 come indicato nel sito e calcolo il bcc prendendo anche il primo valore (02) mentre in quel sito lo esclude.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Guarda che BCC e' l'abbreviazione di Block Check Character ma corrisponde al byte che e' il risultato dell'operazione degli xor, non va incluso quindi BCC nella stringa ...!

    Quindi, se hai la stringa

    "0200040C0044534330303030312E4A504703"

    il calcolo di tutti gli xor (0x02^ ... ^0x03) ha come risultato 1F e quindi la stringa completa sara'

    "0200040C0044534330303030312E4A5047031F"

    A questo punto, cosa non riesci a fare? Hai scritto del codice?

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    8
    Purtroppo a parte un po' di esempi che si avvicinano a quello che mi serve, un gran mal di testa per aver cercato di capire un linguaggio che fa parte ormai di un lontano passato non e' che sono riuscito a ricavare qualcosa di utile.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Onecarb
    Purtroppo a parte un po' di esempi che si avvicinano a quello che mi serve, un gran mal di testa per aver cercato di capire un linguaggio che fa parte ormai di un lontano passato non e' che sono riuscito a ricavare qualcosa di utile.
    Ok ... ma quindi?

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    8
    Quindi avrei bisogno di una mano che in pratica sarebbe la funzione scritta . Non sono abituato e non mi piace chiedere la pappa pronta, pero' so riconoscere i miei limiti e credo che tutto sommato per chi conosce questo linguaggio molto bene non dovrebbe essere difficile da buttare giu' una funzione simile. Concettualmente, per quello che ho capito si tratta di leggere i singoli caratteri del testo in input, trasformali nel loro valore esadecimale e sia accodarli ad una stringa come coppia di caratteri che rappresentano il valore esadecimale sia usarli nel calcolo del carattere di controllo, dopo aver aggiunto i due codici di controllo. Alla fine uscire con quella stringa. Uno script che si avvicina a quello che mi serve puo' essere :
    __gc class HexTest
    {
    static Char hexDigits[] = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    public:
    static String* ToHexString(Byte bytes[]) {
    Char chars[] = new Char[bytes->Length * 2];
    for (int i = 0; i < bytes->Length; i++) {
    int b = bytes[i];
    chars[i * 2] = hexDigits[b >> 4];
    chars[i * 2 + 1] = hexDigits[b & 0xF];
    }
    return new String(chars);
    }
    };

    int main() {

    Byte b[] = {0x00, 0x12, 0x34, 0x56, 0xAA, 0x55, 0xFF};
    Console::WriteLine(HexTest::ToHexString(b));
    }
    pero' questo mi costruisce una classe e non una funzione che poi potrei inglobare nella struttura di compilazione di una dll. Diciamo che piu' o meno si avvicina ad un primo passo del problema.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se usi il semplice C (e non il C++ managed) con un progetto Win32 console, allora puoi scrivere semplicemente

    codice:
    #define BYTES 7
    
    void ToHex(unsigned char *p, char *s)
    {
      int i;
      for(i=0; i<BYTES; i++)
        _snprintf(s+i*2, 2, "%02X", *(p+i));
      *(s+i*2)=0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      unsigned char b[] = {0x00, 0x12, 0x34, 0x56, 0xAA, 0x55, 0xFF};
      char *st;
    
      st=(char *)malloc(2*BYTES*sizeof(char)+1);
    	
      ToHex(b, st);
      printf("%s\n", st);
    
      free(st);
    
      return 0;
    }
    che risulta comprensibile e facilmente adattabile a interfacce con DLL e altri linguaggi ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    8
    Allora il codice che mi hai dato l'ho modificato cosi', in modo da riportarlo ad una funzione che poi iglobo nella struttura della dll.
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <TCHAR.H>
    
    void ToHex(unsigned char *p,char *s, int lungh)
    {
      int i;
      for(i=0; i<lungh; i++)
        _snprintf(s+i*2, 2, "%02X", *(p+i));
      *(s+i*2)=0;
    }
    char *F_seriale(unsigned char *szStr, long nbytes)
    {
     char *st;
     st=(char *)malloc(2*nbytes*sizeof(char));
     ToHex(szStr, st, nbytes);
     return st; 
    }
         
    int _tmain(int argc, _TCHAR* argv[])
    {
      unsigned char szStr[] = "prova  ";
      printf("%s\n",F_seriale(szStr,sizeof(szStr) - 1));
      return 0;
    }
    dove chiaramente rendo pubblica la funzione F_seriale. Ho solo un dubbio per il fatto che alloco memoria per st ma poi a differenza dell'esempio non uso il free. E' corretto o si puo' migliorare? Naturalmente ora mi manca il conteggio del BCC e l'inserimento dei due codici di controllo, ma per ora gradirei una verifica Io ho l'ho provata e funziona da consolle, ma come so una cosa e' che funzioni una che non mi formatti il disco rigido .

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.