Laden...

Byte Array mit HEX Werten, einzelne Werte umwandeln nach LSB

Erstellt von floranz vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.636 Views
F
floranz Themenstarter:in
28 Beiträge seit 2006
vor 17 Jahren
Byte Array mit HEX Werten, einzelne Werte umwandeln nach LSB

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

49.485 Beiträge seit 2005
vor 17 Jahren

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

F
floranz Themenstarter:in
28 Beiträge seit 2006
vor 17 Jahren

Ok, ist ja ganz einfach! Das funktioniert soweit! Vielen Dank!!!!
Und wie kann ich mit den Bitoperatoren LSBF direkt auf ein Byte programmieren?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo floranz,

das steht eigentlich in jedem C# Buch und bestimmt auch im Galileo <openbook>: Visual C# 2005 von Andreas Kühnel.

herbivore

F
floranz Themenstarter:in
28 Beiträge seit 2006
vor 17 Jahren

Mmh, ok! Dann werde ich mal weitersuchen! Danke!

F
floranz Themenstarter:in
28 Beiträge seit 2006
vor 17 Jahren
HEX Wert invertieren????

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

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo floranz,

auch das ist ein Fall für Bit-Operationen, hier ~

herbivore

F
floranz Themenstarter:in
28 Beiträge seit 2006
vor 17 Jahren

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?????

49.485 Beiträge seit 2005
vor 17 Jahren

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

F
floranz Themenstarter:in
28 Beiträge seit 2006
vor 17 Jahren

Und wie castet man auf byte?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo floranz,

so grundlegende Fragen beantwortet dir z.B. das Galileo <openbook>: Visual C# 2005 von Andreas Kühnel.

herbivore

B
1.529 Beiträge seit 2006
vor 17 Jahren

Du kannst die Inversion des Bytes durch ein Exklusiv-Oder mit 0xFF ersetzen. Dann klappt es auch mit dem Wertebereich.