none
bit Zustand aus einem Byte lesen (Trim$, Mid$ in VB6) RRS feed

  • 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

    Dienstag, 6. September 2011 06:16

Antworten

  • Hallo Charly!
     
    Zusätlich zu dem, was Dir die anderen schon gesagt haben, noch ein paar
    Anmerkungen:
     
    > ich möchte  den Zustand von jedem Bit eines Bytes lesen können.
     
    Genau das macht deine Funktion nicht. Sie bearbeitet kein Byte sondern einen
    String. In dem könnte z.B. auch "1234ABCD" stehen, ohne daß die Funktion
    fehlschlagen 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 nicht
    zurü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, die
    exakt 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üße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    • Als Antwort markiert charly67160 Mittwoch, 7. September 2011 05:57
    Dienstag, 6. September 2011 10:04

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.aspx

    Ich hoffe, ich konnte etwas helfen.

    Mit den besten Grüßen,

    Konrad

    • Als Antwort vorgeschlagen Heslacher Dienstag, 6. September 2011 07:20
    • Nicht als Antwort vorgeschlagen Heslacher Dienstag, 6. September 2011 07:26
    Dienstag, 6. September 2011 06:50
  • 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.aspx

    oder:

    [C Bitwise Operators]
    http://msdn.microsoft.com/de-de/library/17zwb64t.aspx

    oder:

    [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
    Dienstag, 6. September 2011 07:27
  • 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/
    Dienstag, 6. September 2011 07:28
  • 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

    Dienstag, 6. September 2011 07:42
  • Hallo Charly!
     
    Zusätlich zu dem, was Dir die anderen schon gesagt haben, noch ein paar
    Anmerkungen:
     
    > ich möchte  den Zustand von jedem Bit eines Bytes lesen können.
     
    Genau das macht deine Funktion nicht. Sie bearbeitet kein Byte sondern einen
    String. In dem könnte z.B. auch "1234ABCD" stehen, ohne daß die Funktion
    fehlschlagen 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 nicht
    zurü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, die
    exakt 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üße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    • Als Antwort markiert charly67160 Mittwoch, 7. September 2011 05:57
    Dienstag, 6. September 2011 10:04