Ottenere il valore decimale da un numero binario in C

Venerdì 12 Dicembre 2008

Vi sarà capitata l’occasione di ritrovarvi una stringa contenente un numero binario e di doverlo convertire in un numero decimale ( o comunque memorizzarlo in una variabile ) e utilizzare i procedimenti più assurdi per farlo? No? Beati voi, a me è capitato.. anzi in particolar modo è capitato di avere i vari 1 e 0 divisi in varie variabili.. In questo post farò vedere un metodo, a mio avviso elegante, per ottenere la nostra decantata variabile contenente il valore decimale.

Ed ecco qui, subito subito la funzione:

unsigned char get_value_from_binary_string (const char *s)
{
 short int i;
 unsigned char byte = 0;
 
 if ( !s || strlen (s) != ( sizeof (unsigned char) * 8 ) )
      return byte;
 
 for ( i = (sizeof (unsigned char) * 8) - 1; i > -1; i-- )
       byte = ( byte | (s[(sizeof (unsigned char) * 8) - ( 1 + i )] - '0') ) << ( i ? 1 : 0 );
 
 return byte;
}

Naturalmente qua si parla di una stringa contenente il valore di un byte, ma è facilmente utilizzabili con stringhe contenenti valori di 2, 4, 8, 16, 32 e 64 byte utilizzando le variabili appropriate.
Il fulcro della conversione comunque sta in quelle due righe di for. 2 righe e si fa quello che molti altri farebbero in minimo 20 in modo osceno.

Ciauz ;)

Funzioni Standard.. poco Standard

Giovedì 7 Agosto 2008

Proprio poco fa stavo parlando in chat con Dani, mentre io insultavo quelli che hanno creato la strcmp ( in quanto se gli si passa uno dei due parametri a NULL fa andare il programma in Segmentation Fault che è una bellezza ), mi ha detto che la strcmp oltre a fare il semplice confronto tra le due stringhe restituisce anche la differenza tra i caratteri, e proprio per questo lui l’aveva utilizzata per riordinare alfabeticamente i pacchetti in slackyd.

Allora non sapendo questa cosa da niubbo della situazione mi son messo a fare un test:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)
{
 if ( argc < 3 ) return 1;
 
 printf("Diff: `%d'\n", strcmp(argv[1], argv[2]));
 
 return 0;
}

Benissimo lo vado ad avviare e mi restituisce solo 0 ( uguali ), 1 o -1 ( non uguali ).. dopo vari attimi di stupore da parte sua, va a provare lo stesso identico codice e le stesse identiche stringhe passate come parametro sul suo computer e la funzione lì restituiva davvero la differenza tra le due stringhe!

Ora mi domando cosa renda così variabile una funzione standard che dovrebbbe avere lo stesso funzionamento su tutti i computer del mondo. La versione delle libc comunque era uguale giusto per cronaca. Da notare comunque anche che ho provato la strcasecmp che non dovrebbe far parte del C Standard, e restituisce la famosa differenza tra le due!

? Mah..

P.s.: Altra cosa che mi fa incazzare, se si passa un parametro null alla strcmp, o all’atoi perchè cavolo mi deve compromettere tutto il programma? cosa gli costa a quelli che hanno scritto la gnu c library mettere due piccolissime macro del tipo:

1
2
3
4
5
6
#define return_if_fail(cond) if ( !(cond) ) { \
                                  return; \
                             }
#define return_val_if_fail(cond, val) if ( !(cond) ) { \
                                           return (val); \
                                      }

per controllare che i parametri non siano nulli? BAH!

LYS 1.0

Venerdì 14 Marzo 2008

Nuovo servizio su HdS619.net, ovvero LYS ( Load Your Source ) un servizo che permette appunto di caricare online i propri sorgenti¹ e ottenere una pagina html dove verrà visualizzato il codice con la sintassi colorata e un link diretto al sorgente originale ( così da far contenti gli amanti dei colori e quello del bianco e nero ). Altre notizie su questo servizio ( e la pagina da cui poterlo utilizzare ) le trovate QUI.

¹Per il momento supporta solo sorgenti C

COwH 2(beta)

Mercoledì 12 Marzo 2008

zoom-cow.jpg
E’ nata la versione 2 di COwH ( MUccAH! ( battuta schifosa) Compile Online with HdS619 ), ovvero quel servizietto che forse alcuni di voi conoscono che permette di compilare online dei sorgenti in C per il sistema linux ( in particolare la compilazione avviene su Ubuntu 7.10 ).

Di seguito farò un breve elenco di ciò che c’era nella versione precedente e ciò che c’è in quella nuova. (more…)

  • StatPress

    Visits today: 4