String Verarbeitung zu Byte()

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von iZotope.

    String Verarbeitung zu Byte()

    Hey Community.
    Ich hab folgendes Problem:
    Ich habe eine Funktion, die mir einen String zurückgibt.
    Der String soll nach jedem 2. Zeichen gesplittet werden, und in einen ByteArray (Dim MyArray() As Byte) geschrieben werden.
    Der String sieht z.B. wie folgt aus:
    451C4000
    Den Endwert den ich hier am Ende haben will soll so aussehen:

    VB.NET-Quellcode

    1. Dim MyArray() As Byte = New Byte() {&H45, &H1C, &H40, &H0}

    (&H steht für Hex)

    Ich hab 0 Ahnung, wie ich den String splitten soll, dass das Ergebnis rauskommt..
    Hat da jemand eine Ahnung..? :)
    Danke schonmal für den Versuch :)

    VB.NET-Quellcode

    1. Dim MyArray() As Byte
    2. For i As Integer = 0 To MyFloatHex.Length - 1 Step 2
    3. MyArray(MyArray.Length) = Convert.ToByte(MyFloatHex.Substring(i, 2), 16)
    4. Next


    MyArray(MyArray.Length) = Convert.ToByte(MyFloatHex.Substring(i, 2), 16)
    System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    bei FloatProject.FrmMain.Patch() in I:\Backup\MultiMedia\Programming\Visual Basic\Projects\FloatProject\FloatProject\FrmMain.vb:Zeile 31.

    VB.NET-Quellcode

    1. '------------------Daten(Bytearray) in String und zurück-------------------
    2. Public Function StringToByteArray(ByRef str As String) As Byte()
    3. Return Convert.FromBase64String(str)
    4. End Function
    5. Public Function ByteArrayToString(ByRef Barr() As Byte) As String
    6. Return Convert.ToBase64String(Barr)
    7. End Function
    8. '------------------Text in Bytearray und zurück-------------------
    9. Public Function TextStringToByteArray(ByRef str As String) As Byte()
    10. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    11. Return enc.GetBytes(str)
    12. End Function
    13. Public Function ByteArrayToTextString(ByRef Barr() As Byte) As String
    14. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
    15. Return enc.GetString(Barr)
    16. End Function


    dotnet-snippets.de/dns/string-…rueck-wandeln-SID645.aspx
    Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!
    Hi
    @Dodo: Du hast nen kleinen Fehler drin. Du schreibst an die falsche Position des Arrays.
    @iZotope: Du musst natürlich eine Instanz für das Array festlegen.
    @bla: Das funktioniert nur für Base64 Strings. Diese hat er nicht.
    @Topic:

    VB.NET-Quellcode

    1. Dim MyFloatHex As String = "451C4000"
    2. Dim n As Integer = MyFloatHex.Length \ 2
    3. Dim buffer(n - 1) As Byte
    4. For i As Integer = 0 To MyFloatHex.Length - 1 Step 2
    5. buffer(i \ 2) = Convert.ToByte(MyFloatHex.Substring(i, 2), 16)
    6. Next


    Gruß
    ~blaze~

    bla schrieb:

    @Topic:

    VB.NET-Quellcode

    1. Dim MyFloatHex As String = "451C4000"
    2. Dim n As Integer = MyFloatHex.Length \ 2
    3. Dim buffer(n - 1) As Byte
    4. For i As Integer = 0 To MyFloatHex.Length - 1 Step 2
    5. buffer(i \ 2) = Convert.ToByte(MyFloatHex.Substring(i, 2), 16)
    6. Next


    Gruß
    ~blaze~

    Das funktioniert einwandfrei
    Vielen vielen Dank an alle, und vorallem natürlich an ~blaze~
    :)
    Ich glaube das geht mit Convert.ToBytes / rückwandlung: Convert.ToString
    U.u. gehts auch so:

    VB.NET-Quellcode

    1. Function ToByteArray(ByVal Str As String) As Byte()
    2. Dim ListOfBytes As List(Of Byte) = New List(Of Byte) 'Fehler?
    3. For Each Chr As Char In Str.ToString.Chars()
    4. ListOfBytes.Add(Convert.ToInt32(Chr))
    5. Next Chr
    6. Return CType(ListOfBytes.ToArray(), Byte()) 'Fehler bei CType? GGf. weglassen.
    7. End Function



    Dürfte an den markierten fehler (möglicherweise!) fehler enthalten.
    Habe es jetzt mal freihand geschrieben.
    Der code packt die CharCodes des Zeichens als Integer in den ByteArray. :P
    powachill: Sry, aber der Code ist wirklich hässlich. Schalt bitte auch mal Option Strict auf On, das gehört zum guten Stil. Da wird dir auffallen, dass du einen Integer einem List(Of Byte) hinzufügst. Integer bestehen im Memory aus 4 Bytes, Bytes logischerweise aus 1. Das heißt, 3 Bytes sind sinnlos und zudem auch fehleranfällig, da ein Integer einen wesentlich größeren Wertebereich hat (-2^31 bis 2^31 -1), als ein Byte (0 bis 255). Zudem brauchst du keine List(Of Byte), sondern ein Array wäre besser. Die List(Of Byte) reserviert ständig neuen Speicher, sobald der von ihr allokierte nicht mehr ausreicht. Wenn du also keine Capacity angibst, so wird der Code wesentlich länger benötigen. Der Cast von einem List(Of Byte) zu einem Byte-Array ist ebenfalls nicht vorgesehen. Dazu verwendet man normalerweise die ToArray()-Methode des List(Of Byte). Dann ist außerdem noch Str bereits ein String. Das heißt, die ToString-Methode ist überflüssig. Die Chars des Strings sind übrigens nur einzelne Zeichen. Das heißt, dass nur jeder Buchstabe in einen Integer konvertiert wird und nicht 2 Zeichen (Dazu kommt, dass der Character-Wert angegeben wird, also der eigentliche Wert im Memory).

    Nimms mir nicht übel, aber nimm bitte ein Buch in die Hand und les dich ein wenig ein. Aber der wichtigste Schritt ist, Option Strict auf On zu stellen. (im Englischen Visual Studio 2008 unter Tools->Projects and Solutions->VB-Defaults->Option Strict:->'On'

    Gruß
    ~blaze~
    @iZotope & ~blaze~: Meins war auch lediglich ein BEISPIEL und keine Copy & Paste Variante, ich habe gehofft dass der User nun selbstständig weitermachen könne, aber mal wieder wurde ich eines besseren belehrt was die Eigeninitiative hier angeht.

    Dodo schrieb:

    @iZotope & ~blaze~: Meins war auch lediglich ein BEISPIEL und keine Copy & Paste Variante, ich habe gehofft dass der User nun selbstständig weitermachen könne, aber mal wieder wurde ich eines besseren belehrt was die Eigeninitiative hier angeht.

    Fang mal nicht an, mich hier als "typischen spasti-user" zu bezeichnen, klar?
    Ich habe mich, bevor ich hier im Forum gepostet habe selbst mit meinem Problem beschäftigt.
    Da ich aber zu keiner Lösung gekommen bin, und mir dein Beitrag nicht sonderlich geholfen hat, da ich die Fehlermeldung als nicht sonderlich hilfreich empfand, hat ~blaze~ einen Weg gepostet, der funktioniert.
    Wo ist das Problem dabei, dass er mir jetzt mehr geholfen hat, als du?
    Seins funktioniert halt, deins nicht.