Benutzer mit den meisten Antworten
bit Zustand aus einem Byte lesen (Trim$, Mid$ in VB6)

Frage
-
Hallo,
ich möchte den Zustand von jedem Bit eines Bytes lesen können. Beispiel, Byte= 0000 0001, wenn bit0=1 ist dann wird eine Aktion ausgelöst.
ich habe bist jetzt in VB6 gearbeitet aber wie kann ich meine Funktion in C# wandeln?
in VB6, sieht es so aus:
Function Trim_Dctl(ByVal InDctl As Variant, ByRef MyTab() As Integer) As Integer
MyTab(1) = Val(Trim$(Mid$(InDctl, 1, 1)))
MyTab(2) = Val(Trim$(Mid$(InDctl, 2, 1)))
MyTab(3) = Val(Trim$(Mid$(InDctl, 3, 1)))
MyTab(4) = Val(Trim$(Mid$(InDctl, 4, 1)))
MyTab(5) = Val(Trim$(Mid$(InDctl, 5, 1)))
MyTab(6) = Val(Trim$(Mid$(InDctl, 6, 1)))
MyTab(7) = Val(Trim$(Mid$(InDctl, 7, 1)))
MyTab(8) = Val(Trim$(Mid$(InDctl, 8, 1)))
End Function
Antworten
-
Hallo Charly!Zusätlich zu dem, was Dir die anderen schon gesagt haben, noch ein paarAnmerkungen:> ich möchte den Zustand von jedem Bit eines Bytes lesen können.Genau das macht deine Funktion nicht. Sie bearbeitet kein Byte sondern einenString. In dem könnte z.B. auch "1234ABCD" stehen, ohne daß die Funktionfehlschlagen würde - das Ergebnis wäre dann aber wohl nicht, was Du erwartest.Außerdem ignoriert die Funktion MyTab(1) und einen Wert gibt sie auch nichtzurück - Sub wäre wohl angebrachter.> MyTab(1) = Val(Trim$(Mid$(InDctl, 1, 1)))> MyTab(2) = Val(Trim$(Mid$(InDctl, 2, 1)))> MyTab(3) = Val(Trim$(Mid$(InDctl, 3, 1)))> MyTab(4) = Val(Trim$(Mid$(InDctl, 4, 1)))> MyTab(5) = Val(Trim$(Mid$(InDctl, 5, 1)))> MyTab(6) = Val(Trim$(Mid$(InDctl, 6, 1)))> MyTab(7) = Val(Trim$(Mid$(InDctl, 7, 1)))> MyTab(8) = Val(Trim$(Mid$(InDctl, 8, 1)))Dieses Konstrukt schreit übrigens nach einer Schleife ;-)Wenn Dir das alles bewußt ist, und Du immer noch eine Methode in C# willst, dieexakt wie Deine VB6-Funktion arbeitet, nimm z.B. die:int Trim_Dctl(string inDctl, int[] myTab){for (int i = 0; i < 8; i++){string s = inDctl.Substring(i, 1);int.TryParse(s, out myTab[i + 1]);}return 0;}GrüßeThomas--Any problem in computer science can be solved with another layerof indirection. But that usually will create another problem.David Wheeler
- Als Antwort markiert charly67160 Mittwoch, 7. September 2011 05:57
Alle Antworten
-
Hallo,
Du kannst die bitweise logik von AND nutzen.
Wenn MyByte DeinByte enthält, dann kannst Du z.B. prüfen: (MyByte And 1) = 1 ist wahr, wenn das erste Bit gesetzt ist.
für das zweite Byte wäre es (MyByte And 2) = 2, für das dritte: (MyByte And 4) = 4, u.s.w.Die Klammern müssen wohl gesetzt werden, da Vergleichsoperationen vor Bitweisen Operatoren ausgeführt werden.
Ich hoffe dies hat etwas geholfen.
Links (Automatisch übesetzt leider nur):
http://msdn.microsoft.com/de-de/library/wz3k228a(v=VS.100).aspx
http://msdn.microsoft.com/de-de/library/fw84t893.aspxIch hoffe, ich konnte etwas helfen.
Mit den besten Grüßen,
Konrad
-
Hallo Charly,
in C# würde man da normal mit BitArray, oder Bitweise Operatoren, BitVector, oder BitConverter arbeiten.
Hier Beispiele und Informationen:[BitArray-Klasse (System.Collections)]
http://msdn.microsoft.com/de-de/library/system.collections.bitarray.aspxoder:
[C Bitwise Operators]
http://msdn.microsoft.com/de-de/library/17zwb64t.aspxoder:
[BitVector32-Struktur (System.Collections.Specialized)]
http://msdn.microsoft.com/de-de/library/system.collections.specialized.bitvector32.aspx[BitConverter-Klasse (System)]
http://msdn.microsoft.com/de-de/library/system.bitconverter.aspx
ciao Frank
- Als Antwort vorgeschlagen Konrad Neitzel Dienstag, 6. September 2011 07:43
- Bearbeitet Frank Dzaebel Dienstag, 6. September 2011 16:05
-
Konrad,
das gilt so nur für VB. Der OP wollte aber die C# Version.
Hannes
If you have got questions about this, just ask.
In a perfect world,
users would never enter data in the wrong form,
files they choose to open would always exist
and code would never have bugs.
C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/ -
Nun gut. Irgendwie habe ich übersehen, dass ich im Visual C# Forum war 8Und extra die VB Links rausgesucht)
C# ist das aber auch 1:1 so umsetzbar:
int myBytes = 17;
if ((myBytes & 1) == 1)
{
// first Byte set
}Die Reihenfolge beim Ausführen ist ebenfalls so wie bei VB, so dass die Klammern erneut wichtig sind.
Die Lösung von Frank ist aber besser, wenn einen alle Bits interessieren. Meine Lösung ist halt mehr etwas für ein Prüfen eines einzelnen Bits.
Mit den besten Grüßen,
Konrad
-
Hallo Charly!Zusätlich zu dem, was Dir die anderen schon gesagt haben, noch ein paarAnmerkungen:> ich möchte den Zustand von jedem Bit eines Bytes lesen können.Genau das macht deine Funktion nicht. Sie bearbeitet kein Byte sondern einenString. In dem könnte z.B. auch "1234ABCD" stehen, ohne daß die Funktionfehlschlagen würde - das Ergebnis wäre dann aber wohl nicht, was Du erwartest.Außerdem ignoriert die Funktion MyTab(1) und einen Wert gibt sie auch nichtzurück - Sub wäre wohl angebrachter.> MyTab(1) = Val(Trim$(Mid$(InDctl, 1, 1)))> MyTab(2) = Val(Trim$(Mid$(InDctl, 2, 1)))> MyTab(3) = Val(Trim$(Mid$(InDctl, 3, 1)))> MyTab(4) = Val(Trim$(Mid$(InDctl, 4, 1)))> MyTab(5) = Val(Trim$(Mid$(InDctl, 5, 1)))> MyTab(6) = Val(Trim$(Mid$(InDctl, 6, 1)))> MyTab(7) = Val(Trim$(Mid$(InDctl, 7, 1)))> MyTab(8) = Val(Trim$(Mid$(InDctl, 8, 1)))Dieses Konstrukt schreit übrigens nach einer Schleife ;-)Wenn Dir das alles bewußt ist, und Du immer noch eine Methode in C# willst, dieexakt wie Deine VB6-Funktion arbeitet, nimm z.B. die:int Trim_Dctl(string inDctl, int[] myTab){for (int i = 0; i < 8; i++){string s = inDctl.Substring(i, 1);int.TryParse(s, out myTab[i + 1]);}return 0;}GrüßeThomas--Any problem in computer science can be solved with another layerof indirection. But that usually will create another problem.David Wheeler
- Als Antwort markiert charly67160 Mittwoch, 7. September 2011 05:57