Empfangene bytes als byte in texbox Schreiben

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Empfangene bytes als byte in texbox Schreiben

    Hallo,

    Ich empfange meine daten aus einem Göfneten TCP Client via:

    VB.NET-Quellcode

    1. Function client_abhören() As String
    2. Try
    3. client_abhören = reader.ReadByte
    4. Catch
    5. MsgBox("Verbindung unterbrochen")
    6. End Try
    7. End Function
    8. Function empfangen()
    9. While client.Connected
    10. R2.Text = R2.Text & client_abhören()
    11. End While
    12. End Function​


    Jetzt möchte ich das die empfangen bytes nicht umgerechnet werden, ich möchte das es genau so wie empfangen ausgegeben wird. also als beispiel:
    es wird empfangen
    -&H0, &H2, &H0, &H0, &H0, &H6, &H0, &H3, &H0, &H14, &H0, &H8
    dann soll in der Textbox stehen
    - 00 02 00 00 00 06 00 03 00 14 00 08
    R2 ist eine Richttextbox, da das ganze als neuer therad ableuft, habe ich zusetlich einen timer der die richtextbox 2 mit dem text von R2 füttert.

    der fuktieoniert aber es steht eben nicht
    00 02 00 00 00 06 00 03 00 14 00 08
    sondern irgendwelchen unsinnigen zahlen (habe noch nciht wirklich verstanden wie er das Konvertiert bzw. rechnet)
    02000190316000000000000005226
    habe es eben probiert, bekomme leider ein error:
    Fehler 9 Der Wert vom Typ "Byte" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.

    VB.NET-Quellcode

    1. Function client_abhören() As String
    2. Try
    3. Dim t As Byte
    4. T = reader.Read
    5. client_abhören = System.BitConverter.ToString(t)
    6. Catch
    7. MsgBox("Verbindung unterbrochen")
    8. End Try
    9. End Function
    10. Function empfangen()
    11. While client.Connected
    12. R2.Text = R2.Text & client_abhören()
    13. End While
    14. End Function​
    denn probierma

    VB.NET-Quellcode

    1. Function client_abhören() As Byte
    2. Return reader.ReadByte()
    3. End Function
    4. Function empfangen()
    5. While client.Connected
    6. R2.Text = String.Format("{0} {1}", R2.Text, client_abhören())
    7. End While
    8. End Function
    erstmal sehen, ob das geht, dann stehen weitere Verbesserungen an.
    Fuktioenieren tut es also keine fehler aber:

    das sollte da stehen:
    00 02 00 00 00 13 00 03 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 E2

    jetzt steht aber da:
    0 2 0 0 0 19 0 3 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 226

    tehortisch hat er das jetzt einfach schon umgerechnet das ist eig. auch nciht schlimm. aber er rechnet falsch 05 E2 müsste 1506 ergeben und nicht 5 226
    der rest stimmt

    was vil. wichtig ist ist:

    00 02 00 00 00 13 00 03 10 wird alles 2 stellig gerechnet, (der letzte wert 10 = 16 sind die nachfolgenden bytes) ab dann muss alles 4 stellig berechnet werden also 00 00 = 0000 05 E2=1506 usw

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „KAXTJ“ ()

    KAXTJ schrieb:

    05 E2 müsste 1506 ergeben und nicht 5 226
    Du hast gesagt, du wollest Bytes anzeigen.
    1506 ist aber kein Byte - Byte geht nur bis 255.


    Auch hast du gesagt, du willst kein Hex-Format - aber was bei dir als "sollte da stehen" bezeichnet wird ist, Hex-Format, und zwar ist Byte-weises Hex-Format.

    Sag nochmal, was du wirklich anzeigen möchtest.
    anfangs wollte ich das er mir den Hex code den er empfägt anzeigt also:
    00 02 00 00 00 13 00 03 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 E2
    dann hatte ich vor das ganz über ein split zu spillten um zu rechnen (die ersten stellen immer als paar und und die letzten stellen immer 4 stellig. dann das ganze verarbeiten.

    da er das jetzt aber gleich umrechnet könnte ich es auch danach spiltten, ist schon ein arbeitsweg weniger. aber dann muss er die letzten 16 Stellen immer als 4 paar umrechnen (von hex in dezimal). es sind aber nicht immer 16 stellen, das richtet sich danach:

    Stelle 1 und 2 = Anfrage nummer (kann unbeahtet bleiben)
    Stelle 3-5= Sender identifikationsnumer (immer 00 00 00) (kann unbeahtet bleiben)
    Stelle 6 und 7 = Unrelefant (kann unbeahtet bleiben)
    Stelle 8 = von mir angefragter Fuktionscode (03=Lesen das muss er Verarbeiten weil enn da z.b. 06 steht muss er den empfangenen code ignoerieren)
    Stelle 9= nachfolgende Bites (das muss er verarbeiten, er muss wissen das nach so und so vielen bites ein neuer code anfängt)
    Stelle 10-26= Register werte, diese müssen immer zu 4 berechnet werden also 0000=0 das soll dann in einer tabelle eingetragen werden.
    jetzt fiktioeniert es soweit meine dabelle wirt mit den Hex werten gefüttert (Die erste spalte) die zweite spalte soll jetzt den dezmal wert anzeigen. fuktieoniert aber nicht habe es So probiert:

    VB.NET-Quellcode

    1. Dim dezimal1 As Long
    2. RichTextBox2.Text = R2.Text
    3. TextBox2.Text = daten1.Text
    4. TextBox5.Text = daten2.Text
    5. TextBox8.Text = daten3.Text
    6. TextBox11.Text = daten4.Text
    7. TextBox14.Text = daten5.Text
    8. TextBox17.Text = daten6.Text
    9. TextBox20.Text = daten7.Text
    10. TextBox23.Text = daten8.Text
    11. Dim str1 As String
    12. str1 = TextBox24.Text
    13. dezimal1 = CLng("&H" & str1) 'Hier kommt der fehler: Ungültige Konvertierung von der Zeichenfolge &H in Typ Long
    14. TextBox3.Text = dezimal1


    er muss den wert 05E2 in 1506 umrechnen.

    EDIT:

    fuktienoiert jetzt:

    VB.NET-Quellcode

    1. ​RichTextBox2.Text = R2.Text
    2. TextBox2.Text = daten1.Text
    3. TextBox5.Text = daten2.Text
    4. TextBox8.Text = daten3.Text
    5. TextBox11.Text = daten4.Text
    6. TextBox14.Text = daten5.Text
    7. TextBox17.Text = daten6.Text
    8. TextBox20.Text = daten7.Text
    9. TextBox23.Text = daten8.Text
    10. If Not TextBox2.Text = "" Then
    11. TextBox3.Text = Convert.ToInt32(TextBox2.Text, 16)
    12. TextBox6.Text = Convert.ToInt32(TextBox5.Text, 16)
    13. TextBox9.Text = Convert.ToInt32(TextBox8.Text, 16)
    14. TextBox12.Text = Convert.ToInt32(TextBox11.Text, 16)
    15. TextBox15.Text = Convert.ToInt32(TextBox14.Text, 16)
    16. TextBox18.Text = Convert.ToInt32(TextBox17.Text, 16)
    17. TextBox21.Text = Convert.ToInt32(TextBox20.Text, 16)
    18. TextBox24.Text = Convert.ToInt32(TextBox23.Text, 16)
    19. End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KAXTJ“ ()

    CLng("&H" & str1)

    &H ist nur die VB-spezifische Schreibweise von Ganzzahl-Literalen in Basis 16.
    Beispiel:

    VB.NET-Quellcode

    1. Dim A As Integer = 12345
    2. Dim B As Integer = A And &H7F00

    In C# würde man stattdessen 0x davor schreiben.

    CLng erwartet trotzdem nur die Ziffern: CLng(str1)
    Besser noch: Verwende Long.TryParse.
    Und noch besser noch: Statt str1 zu deklarieren, dann zuzuweisen und dann zu verwenden, kannst Du direkt TextBox24.Text.Text verwenden.

    Und dann natürlich die standard-Tipps:
    1. Controls aussagekräftig benennen. Ohne in der IDE nachzusehen: was macht TextBox12?
    2. Ich würde Dir auch raten, Int64 statt Long hinzuschreiben. Integer ist so standard, dass man weiß, dass Int32 gemeint ist, und meistens ist einem die genaue Größe auch egal. Aber wenn man sich extra Gedanken darüber macht, wie viele Bits die Zahl benötigen soll, dann sollte man das auch hinschreiben. Also Int16 statt Short, Int32 statt Integer und Int64 statt Long.
    3. Wenn Du nicht anders garantieren kannst, dass der Text immer zum passenden Datentyp konvertiert werden kann, dann solltest Du Datentyp.TryParse verwenden. Also wie oben Long.TryParse bzw. Int64.TryParse.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils