2015-05-15 30 views
10

Sto lavorando a un driver per un sensore di temperatura. I valori stanno venendo in forma esadecimale e sono conservati come:Come posso rilevare valori esadecimali negativi in ​​C#?

string tempHex = "08C5"; //-> Would be 22,45°C 

Il problema è che il sensore può anche notare valori negativi e non ho idea di come posso rilevare complemento a 2 in C#.

Forse puoi aiutarmi. Grazie!

+0

Hai letto la scheda tecnica del sensore? Solitamente nel foglio dati si ottiene ** un'espressione matematica ** per convertire * dati grezzi * in * dati utili *. – adricadar

+0

L'ho fatto, ma il problema è che dicono solo che i valori negativi sono mostrati nella forma del complemento a 2. – xileb0

+0

Cosa * esattamente * intendi per "i valori stanno arrivando in forma esadecimale"? Li stai effettivamente leggendo come * stringhe *? Sembra molto strano. Sono sempre 2 byte? Questa domanda è troppo vaga al momento ... se potessi mostrare quello che hai ottenuto finora, sarebbe davvero d'aiuto. –

risposta

5

Un semplice convert farebbe, è complicato come implementare il complemento del 2 imho. Per esempio:

static bool isPositive(string hex) 
{ 
    return Convert.ToInt16(hex, 16)>0; 
} 
+0

Questo non funzionerà per i dati di esempio. Per una stringa esadecimale a 4 cifre (come mostrato nell'esempio), tutti i valori saranno positivi, poiché 'Convert.ToInt32 (" FFFF ", 16)' sarà 65535 non -1. Per ottenere un 'Int32' negativo è necessaria una stringa esadecimale a 8 cifre che inizi con 8 a F. Usa invece 'Convert.ToInt16'. –

+0

@MarkLakata Capisco, grazie. –

18
static public double Temp(string hex) 
{ 
    return Convert.ToInt16(hex,16)*0.01; 
} 

valori da 0000 a 7FFF saranno positivi, 8000 a FFFF sarà negativo. Fortunatamente, Convert.ToInt16() fa tutto questo per te, dato che questo è esattamente il modo in cui i numeri vengono memorizzati internamente su tutti i computer moderni. Devi solo moltiplicare per 0,01 per ottenere Celsius.