Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Conversione hex->int elegante

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

4
voti

[1] Conversione hex->int elegante

Messaggioda Foto Utenteboiler » 27 ott 2015, 23:24

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
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

[2] Re: Conversione hex->int elegante

Messaggioda Foto UtenteIlGuru » 27 ott 2015, 23:55

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
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

1
voti

[3] Re: Conversione hex->int elegante

Messaggioda Foto Utenteboiler » 28 ott 2015, 0:01

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
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

[4] Re: Conversione hex->int elegante

Messaggioda Foto Utenteangus » 28 ott 2015, 0:11

Per curiosità personale, senza nulla togliere all'eleganza della conversione =D> , non bastava int.Parse o ancora meglio int.TryParse? :roll:
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.475 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4168
Iscritto il: 20 giu 2008, 17:25

0
voti

[5] Re: Conversione hex->int elegante

Messaggioda Foto Utenteboiler » 28 ott 2015, 0:13

Funziona solo su strings, non su chars e non puoi fare un cast dall'elemento di una string su un char direttamente.

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

[6] Re: Conversione hex->int elegante

Messaggioda Foto Utenteultrasound91 » 28 ott 2015, 0:14

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.
Avatar utente
Foto Utenteultrasound91
318 2 4 6
Disattivato su sua richiesta
 
Messaggi: 700
Iscritto il: 26 ago 2014, 21:02

0
voti

[7] Re: Conversione hex->int elegante

Messaggioda Foto Utenteboiler » 28 ott 2015, 0:19

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
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

[8] Re: Conversione hex->int elegante

Messaggioda Foto UtenteRussell » 28 ott 2015, 0:28

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:
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2193
Iscritto il: 4 ott 2009, 10:25

0
voti

[9] Re: Conversione hex->int elegante

Messaggioda Foto Utenteboiler » 28 ott 2015, 0:41

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
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5612
Iscritto il: 9 nov 2011, 12:27

0
voti

[10] Re: Conversione hex->int elegante

Messaggioda Foto UtenteRussell » 28 ott 2015, 0:43

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;
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2193
Iscritto il: 4 ott 2009, 10:25

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 72 ospiti