Äquivalent zu Funktion C++ gesucht

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von timmi31061.

    Äquivalent zu Funktion C++ gesucht

    Hallo,

    ich versuche etwas in VB.net nachzuprogrammieren, Vorlage dabei ist folgender C++/Qt code:

    C-Quellcode

    1. const QString str = "191.168.2.249"
    2. const QByteArray strBase64 = QByteArray(str.toLatin1()).toBase64();
    3. //============ strBase64 =============
    4. //4d 54 6b 79 4c 6a 45 32 4f 43 34 79 4c 6a 49 30 4f 51 3d 3d
    5. const qint16 strSize = strBase64.size(); // = 20
    6. QByteArray encodedStr;
    7. QDataStream stream(&encodedStr, QIODevice::WriteOnly);
    8. stream.setByteOrder(QDataStream::LittleEndian);
    9. stream << strSize;
    10. stream.setByteOrder(QDataStream::BigEndian);
    11. stream.writeRawData(strBase64, strSize);
    12. return encodedStr;
    13. //============ encodedStr =============
    14. //14 00 4d 54 6b 79 4c 6a 45 32 4f 43 34 79 4c 6a 49 30 4f 51 3d 3d


    Ziel ist es in VB.net den ByteArray "encodedStr" zu erhalten, so wie das Ergebnis oben in C++.

    So sieht mein VB.net code aus:

    VB.NET-Quellcode

    1. Dim payLoad As Byte() = {}
    2. Dim remoteIpEncoded As Byte() = Encoding.ASCII.GetBytes(ToBase64("192.168.2.249"))
    3. Dim loadSize As Byte() = HexTOByte(Convert.ToString(remoteIpEncoded.Length, 16)) '// remoteIpEncoded.Length = 20
    4. Array.Resize(payLoad, remoteIpEncoded.Length + loadSize.Length)
    5. loadSize.CopyTo(payLoad, 0)
    6. remoteIpEncoded.CopyTo(payLoad, loadSize.Length)
    7. '// Daraus folgt für payLoad:
    8. '// 14 4D 54 6B 79 4C 6A 45 32 4F 43 34 79 4C 6A 49 30 4F 51 3D 3D
    9. Private Function HexTOByte(str As String) As Byte()
    10. Dim hexString As String = str
    11. Dim length As Integer = hexString.Length
    12. Dim upperBound As Integer = length \ 2
    13. If length Mod 2 = 0 Then
    14. upperBound -= 1
    15. Else
    16. hexString = "0" & hexString
    17. End If
    18. Dim bytes(upperBound) As Byte
    19. For i As Integer = 0 To upperBound
    20. bytes(i) = Convert.ToByte(hexString.Substring(i * 2, 2), 16)
    21. Next
    22. Return bytes
    23. End Function


    Wie man sieht ist der einzige Unterschied der Anfang "14 00 4D" im Vergleich zu "14 4D". Ich gehe mal davon aus, dass in C++ "stream << strSize;" verursacht, dass "14 00" in das ByteArray geschrieben wird, bei mir wird allerdings nur "14" in payLoad geschrieben.
    Die eigentliche Frage ist, warum fehlen bei mir die 00 bzw. wie ist die korrekte Übersetzung von "stream << strSize;" in vb?

    Danke
    Du koenntest dir als erstes deine Methode HexTOByte ersparen, das Framework hat da auch eine einfache eingebaute Loesung.

    C#-Quellcode

    1. byte[] bytes = Encoding.Default.GetBytes(Convert.ToBase64String)
    Damit bekommst du einfach die Bytes eines String-Hex.

    Ich koennte mir nun vorstellen, dass 00 fehlt weil VB.NET das moeglicherweise als unnoetig anerkennt und es irgendwo aussortiert, da es ja nur zwei Nullen sind. Hast du mal den umgekehrten Weg versucht ob da noch der gleiche String rauskommt?
    (Ich kenne mich da jetzt nicht so wirklich aus, also muss es nicht stimmen, was ich hier erzaehle.)

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

    Moin,

    benutze einfach die Funktionen in der BitConverter-Klasse. In deinem Fall ist die .GetBytes(Int16)-Methode interessant: LinkWahrscheinlich musst du die Zahl aber erst noch zu einem Int16 casten:

    VB.NET-Quellcode

    1. Dim bytes As Byte() = BitConverter.GetBytes(CShort(irgendwas.Length))
    Eventuell musst du das Array noch umdrehen. Das funktioniert ab .NET 3.5 ganz einfach mit LINQ mit ​meinArray.Reverse().
    Mit freundlichen Grüßen,
    Thunderbolt