Hallo!
Ich muss über UART 30 Byte Hex-Werte schicken. Dafür habe ich ein Byte-Array welches wie folgt aussieht:
byte[] command = {0x34, 0x00, 0xC0, ...}
Ich muss die einzelnen Array Hex Werte umwandeln. Sie müssen gesendet werden mit dem "Least significant bit first" (LSBF).
Ich habe jetzt die einzelnen HEX in einen binär-String gewandelt:
string bin = Convert.ToString (command [0],2);
Durch eine einfache Funktion werden diese "binär"-Strings dann einmal umgedreht.
00110100->
00101100
Wie kann ich diesen String jetzt in einen HEX Byte umwandeln? Also 00101100 -> 0x2C.
Oder kann man sogar vielleicht diese etwas umständlich Stringumwandlung umgehen und das direkt mit dem HEX-Wert ausführen!
Schon mal vielen Dank!!!
Lieben Gruß
floranz
Hallo floranz.
Convert.ToByte ("00101100", 2);
Mit den Bitorperationen & | ~ << und >> kannst du "Least significant bit first" natürlich auch direkt auf einem Byte programmieren.
herbivore
Ok, ist ja ganz einfach! Das funktioniert soweit! Vielen Dank!!!!
Und wie kann ich mit den Bitoperatoren LSBF direkt auf ein Byte programmieren?
Hallo floranz,
das steht eigentlich in jedem C# Buch und bestimmt auch im Galileo <openbook>: Visual C# 2005 von Andreas Kühnel.
herbivore
Hallo!
Ich versuche grad ne Checksum für ein zu sendenes Bytearray zu berechnen. Ich möchte einfach zunächst die einzelnen Bytes invertieren (ist Vorgabe). Dieses habe ich wie folgt versucht:
public byte [] Checksum (byte[] inBytes)
{
byte [] result = new byte [35];
byte test = inBytes[0];
int bla = Convert.ToInt32(test);
bla = ~bla;
byte yo = Convert.ToByte (bla);
result[0] = yo;
return result ;
}
Wenn ich das im Programm ausführe (Checksum = {0xFF}), gibt es folgende Fehlermeldung:
Ausnahme System.OverflowException wurde im ausgeführten Programm ausgelöst:
Der Wert für ein unsigniertes Byte war zu groß oder zu klein.
Der zu invertierende Wert ist FF. Ich habe mir mal das byte yo als Hex-String ausgeben lassen und es gab folgende Hexwerte: FFFFFF00
Wie kommt es, das der Wert dreimal in das Byte yo geschrieben wird und dann erst der invertierte Wert? Und gibt es eine schönere Lösung?
Vielen Dank schon mal!!!
floranz
Hallo floranz,
auch das ist ein Fall für Bit-Operationen, hier ~
herbivore
Das ist klar! Sehe ich das richtig, dass der zu invertiernede Wert so aussieht:
0000 0000 0000 1111
Dann würde ja durch invertieren 1111 1111 1111 0000 rauskommen, was das Ergebnis ff ff ff 00 erklären würde.
Um diese forderen Bits wegzubekommen, müssen bestimmt Bit-Operationen genommen werden, was mir auch klar ist. Aber welche und wie geht das?????
Hallo floranz,
ach, sorry, du hattest ja schon ~ geschrieben. Ich hatte das für ein - gehalten.
Das das Ergebnis länger ist als byte liegt leider daran:
Bitweise Komplementoperatoren sind für int, uint, long und ulong vordefiniert [also nicht für byte]
Es müsste reichen, das Ergebnis auf byte zu casten.
herbivore
Hallo floranz,
so grundlegende Fragen beantwortet dir z.B. das Galileo <openbook>: Visual C# 2005 von Andreas Kühnel.
herbivore
Du kannst die Inversion des Bytes durch ein Exklusiv-Oder mit 0xFF ersetzen. Dann klappt es auch mit dem Wertebereich.