Pagina 1 di 2

Conversione hex->int elegante

MessaggioInviato: 27 ott 2015, 23:24
da boiler
Lavoro ad un progetto scritto in C# con un programmatore vero (non un elettronico tuttofare come lo sono io). Ed è un piacere, lui trasuda esperienza e io cerco di assorbire (che detta così fa un po' schifo :lol:).

Cosa ho imparato oggi? Come converto una singola cifra esadecimale contenuta in una stringa (quindi un carattere) nel corrispondente integer?

Ci sono sicuramente diverse soluzioni e non avrei avuto difficoltà a trovarne una che contenesse l'instanziazione di un char, un paio di cast e l'uso di qualche classe di .NET.
Ma appunto, questo sono io.

Poi c'è il genio:
Codice: Seleziona tutto
int rrFlag = "0123456789abcdef".IndexOf(inputString[ir]);


Funziona perché la stringa viene da un modulo di campionamento dati che usa sempre le lettere minuscole per l'esadecimale. Ma il problema sarebbe facilmente risolvibile chiamando il metodo ToLower della classe char.

Trovo che sia una soluzione molto elegante, di leggibilità immediata e applicabile anche ad altre conversioni.

Boiler

Re: Conversione hex->int elegante

MessaggioInviato: 27 ott 2015, 23:55
da IlGuru
Nel set aschii se non ricordo male le minuscole sono separate dalle maiuscole di 32 posizioni, quindi il lowercase lo puoi fare con una semplice OR

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:01
da boiler
IlGuru ha scritto:Nel set aschii se non ricordo male le minuscole sono separate dalle maiuscole di 32 posizioni, quindi il lowercase lo puoi fare con una semplice OR


Sì, è una soluzione che si potrebbe usare con sistemi spartani, ma abbiamo tutta la freakin' .NET library a nostra disposizione. Sfruttiamone la magica potenza! Una delle cose che piú apprezzo quando chiudo uVision e apro VisualStudio è che istantaneamente la velocità di calcolo e la memoria disponibile sono entrambi delle buone approssimazioni per "infinito".

Seriamente: la conversione fatta così è bella perché è semplicissima e leggibilissima. Se cominciamo con le operazioni bitwise tutto il concetto va a farsi friggere.

Boiler

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:11
da angus
Per curiosità personale, senza nulla togliere all'eleganza della conversione =D> , non bastava int.Parse o ancora meglio int.TryParse? :roll:

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:13
da boiler
Funziona solo su strings, non su chars e non puoi fare un cast dall'elemento di una string su un char direttamente.

Boiler

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:14
da ultrasound91
Però questo metodo lo puoi applicare solo con quel particolare linguaggio.
Nel lavoro del programmatore si ha a che fare sempre con più linguaggi.
E' meglio non perdere di vista la matematica.

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:19
da boiler
ultrasound91 ha scritto:Però questo metodo lo puoi applicare solo con quel particolare linguaggio.


In Python puoi usarlo praticamente così com'è, adattando quelle porcherie che mi fanno odiare quel linguaggio di progr... scripting (indenting, inesistenza dei tipi,...)

Inoltre, come scritto, non vuole essere una ricetta per dirvi questo è l'unico vero e verace modo di risolvere questo problema, ma è un interessante metodo per risolvere problemi di altro tipo, che non c'entrano nulla con l'esadecimale.

Boiler

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:28
da Russell
comprendo la buona leggibilità, e la comodità di poter scrivere in una riga la funziona che ti serve, ma a performance non mi sentirei tanto soddisfatto
provvederei comunque a farmi una funzioncina con il solito giochetto della sottrazione delle codifiche ascii, ovvero qualcosa del tipo:
Codice: Seleziona tutto
if(c<'a') rrFlag=c-'9';
else rrFlag=c-'a'+10;


comunque interessante soluzione :ok:

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:41
da boiler
Russell ha scritto:
Codice: Seleziona tutto
if(c<'a') rrFlag=c-'9';
else rrFlag=c-'a'+10;


Non capisco come funziona.
Se ammettiamo che arrivi uno zero, quindi 48 in ascii decimale.
L'if è soddisfatto perché 'a' è 97.
Ne consegue che rrFlag = 48 - 57 = -9

Boiler

Re: Conversione hex->int elegante

MessaggioInviato: 28 ott 2015, 0:43
da Russell
hai ragione, ho sonno, avevo fatto proprio un po' di confusione:
ecco che cosi' dovrebbe andare gia' meglio :mrgreen:
Codice: Seleziona tutto
if(c<'a') rrFlag=c-'0';
else rrFlag=c-'a'+10;