Das obere und untere Byte eines Integers in C # erhalten und als char-Array an einen COM-Port senden, wie?

8

In C würde ich das tun

  

Int-Nummer = 3510;

     

char obere = Zahl & gt; & gt; 8;

     

char niedriger = Zahl & amp; & amp; 8;

     

SendByte (oben);

     

SendByte (niedriger);

Wo obere und untere beide = 54

In C # mache ich das:

%Vor%

Jedoch in der Debugger-Nummer = 3510, Ober = 13 und Unter = 0 das macht keinen Sinn, wenn ich den Code in & gt; & gt; 6 upper = 54 was absolut seltsam ist.

Grundsätzlich möchte ich nur das obere und untere Byte von der 16-Bit-Nummer bekommen und es nach "GETDM"

aus dem Com-Port senden

Wie kann ich das tun? Es ist so einfach in C, aber in C # bin ich völlig ratlos.

    
rolls 24.03.2011, 12:54
quelle

5 Antworten

28

Ihre Maskierung ist falsch - Sie sollten gegen 255 (0xff) anstelle von 8 maskieren. Shifting funktioniert in Bezug auf "Bits zum Verschieben durch", während bitweise und / oder gegen den zu maskierenden Wert arbeiten ... also wenn Sie Ich möchte nur die unteren 8 Bits behalten, Sie benötigen eine Maske, die nur die unteren 8 Bits enthält - also 255.

Beachten Sie, dass wenn Sie versuchen, eine Zahl in zwei Bytes aufzuteilen, sollte es wirklich eine kurze oder einfache Sache sein, nicht int (das vier Bytes hat).

%Vor%

Beachten Sie, dass ich ushort anstelle von byte verwendet habe, da bitweises Rechnen einfacher ist, wenn Sie sich keine Gedanken über die Zeichenerweiterung machen müssen. Es wäre in diesem Fall nicht wirklich wichtig wegen der Art und Weise, wie die verkleinerte Umwandlung in byte funktioniert, aber es ist die Art von Sache, an die Sie denken sollten.

    
Jon Skeet 24.03.2011, 12:56
quelle
4

Wahrscheinlich möchtest du es mit 0x00FF

%Vor%

Vollständiges Beispiel:

%Vor%     
SwDevMan81 24.03.2011 12:57
quelle
2

Sollte es nicht sein:

%Vor%     
Nick 24.03.2011 12:57
quelle
2

Selbst wenn die akzeptierte Antwort zu der Frage passt, halte ich sie aufgrund der einfachen Tatsache, dass die Frage int und nicht kurz im Header enthält und sie in den Suchergebnissen irreführend ist, unvollständig, und wie wir wissen, hat Int32 in C # 32 Bit und also 4 Bytes. Ich werde hier ein Beispiel veröffentlichen, das im Falle der Verwendung von Int32 nützlich sein wird. Im Falle eines Int32 haben wir:

  1. LowWordLowByte
  2. LowWordHighByte
  3. HighWordLowByte
  4. HighWordHighByte.

Und als solche habe ich die folgende Methode zur Konvertierung des Int32-Wertes in eine kleine Endian-Hex-Zeichenfolge erstellt, in der jedes Byte durch einen Whitespace von den anderen getrennt ist. Dies ist nützlich, wenn Sie Daten übertragen und möchten, dass der Empfänger die Verarbeitung schneller durchführt, kann er nur Split ("") und die Bytes als eigenständige Hexadezimalzeichenfolgen darstellen.

%Vor%

Verwendung:

%Vor%

Das Ergebnis ist:

  1. 7C 92 00 00
  2. FF FF 03 00
  3. 7C 92
  4. FF.

Wenn es schwierig ist, die Methode, die ich erstellt habe, zu verstehen, dann könnte das Folgende verständlicher sein:

%Vor%

Anmerkungen:

  1. Natürlich kann man von uint pSize ein enum geben, das Byte, Word, DoubleWord
  2. spezifiziert
  3. Anstatt in hexadezimale Zeichenkette umzuwandeln und die kleine endianische Zeichenkette zu erstellen, können Sie in Zeichen konvertieren und tun, was Sie wollen.

Hoffe das wird jemandem helfen!

    
XMight 10.02.2015 09:37
quelle
1

Um ein wenig kreativer zu sein

%Vor%     
MaLio 24.03.2011 13:04
quelle

Tags und Links