2015-05-15 9 views
10

Ich arbeite an einem Treiber für einen Temperatursensor. Die Werte kommen in Hex Form und sie werden gespeichert wie:Wie kann ich negative Hex-Werte in C# erkennen?

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

Das Problem ist, kann der Sensor auch feststellen, negative Werte, und ich habe keine Ahnung, wie ich das Komplement in C# ist 2 erkennen kann.

Vielleicht können Sie mir helfen. Vielen Dank!

+0

Haben Sie das Datenblatt des Sensors gelesen? Normalerweise erhalten Sie im Datenblatt einen ** mathematischen Ausdruck **, um * Rohdaten * in * Utile-Daten * zu konvertieren. – adricadar

+0

Ich tat, aber das Problem ist, sie sagen nur, dass negative Werte in Zweierkomplementform gezeigt werden. – xileb0

+0

Was * genau * meinst du mit "die Werte kommen in Hex-Form"? Sie lesen sie eigentlich als * Strings *? Das scheint sehr merkwürdig. Sind es immer 2 Bytes? Diese Frage ist im Moment zu vage ... Wenn Sie zeigen könnten, was Sie bisher haben, würde das wirklich helfen. –

Antwort

5

Eine einfache convert würde tun, es ist so kompliziert wie die Implementierung der 2er Komplement imho. Zum Beispiel:

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

Dies funktioniert nicht für die Beispieldaten. Für eine 4-stellige hexadezimale Zeichenfolge (wie im Beispiel gezeigt) sind alle Werte positiv, da "Convert.ToInt32 (" FFFF ", 16)' 65535 nicht -1 ist. Um ein negatives "Int32" zu erhalten, benötigen Sie eine 8-stellige Hex-Zeichenfolge, die mit 8 bis F beginnt. Verwenden Sie stattdessen "Convert.ToInt16". –

+0

@MarkLakata Ich verstehe, danke. –

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

Werte von 0000 bis 7FFF positiv sein werden, werden 8000 bis FFFF negativ sein. Glücklicherweise tut Convert.ToInt16() das alles für Sie, denn genau so werden die Zahlen intern auf allen modernen Computern gespeichert. Sie müssen nur um 0,01 multiplizieren, um Celsius zu erhalten.

Verwandte Themen