Zwei Variablen für Schleife

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zwei Variablen für Schleife

    Hallo.

    Wollte mal fragen, ob man diesen Code hier schöner schreiben könnte:

    VB.NET-Quellcode

    1. Private Function Doit(D As String) As String
    2. Dim DecimalHex As Integer() = New Integer(15) {}
    3. Dim MagicBytes As Byte() = {...}
    4. Dim Password As String = String.Empty
    5. Dim x, i As Integer
    6. Dim HexSpl As String = String.Empty
    7. For Each c As Char In Encoding.UTF8.GetString(Convert.FromBase64String(D))
    8. x += 1
    9. HexSpl &= c
    10. If x = 2 Then
    11. x = 0
    12. DecimalHex(i) = Convert.ToInt32(HexSpl, 16)
    13. Password &= Convert.ToChar(DecimalHex(i) Xor MagicBytes(i)).ToString()
    14. i += 1
    15. HexSpl = String.Empty
    16. End If
    17. Next
    18. Return Password
    19. End Function


    Bin für jegliche Verbesserungsvorschläge offen!

    Daniel Baumert schrieb:

    schöner schreiben
    So (ungetestet):

    VB.NET-Quellcode

    1. Private Function Doit(D As String) As String
    2. Dim DecimalHex As Integer() = New Integer(15) {}
    3. Dim MagicBytes As Byte() = {1, 2, 3}
    4. Dim Password As String = String.Empty
    5. Dim HexSpl As String = String.Empty
    6. Dim txt = Encoding.UTF8.GetString(Convert.FromBase64String(D))
    7. For i = 0 To txt.Length - 1 Step 2
    8. Dim j = i \ 2
    9. DecimalHex(j) = Convert.ToInt32(txt.Substring(i, 2), 16)
    10. Password &= Convert.ToChar(DecimalHex(j) Xor MagicBytes(j)).ToString()
    11. Next
    12. Return Password
    13. End Function

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

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

    Vielleicht so etwas...

    VB.NET-Quellcode

    1. Dim convertedString as String = Encoding.UTF8.GetString(Convert.FromBase64String(D))
    2. For i as Integer = 0 To convertedString.Length - 1 Step 2
    3. Dim j as Integer = i\2
    4. DecimalHex(j) = Convert.ToInt32(convertedString.subString(i,2), 16)
    5. Password &= Convert.ToChar(DecimalHex(j) Xor MagicBytes(j)).ToString()
    6. Next

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

    Zusätzliche Informationen: Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen.

    VB.NET-Quellcode

    1. DecimalHex(j) = Convert.ToInt32(txt.Substring(i, 2), 16)


    j hat den Wert 8 , i den Wert 16

    Habe es nun so gelöst:

    VB.NET-Quellcode

    1. Private Function Doit(D As String) As String
    2. Dim DecimalHex As Integer() = New Integer(15) {}
    3. Dim MagicBytes As Byte() = {1,2,3}
    4. Dim Password As String = String.Empty
    5. Dim txt As String = Encoding.UTF8.GetString(Convert.FromBase64String(D))
    6. For i As Integer = 1 To txt.Length - 1 Step 2
    7. Dim j As Integer = i \ 2
    8. DecimalHex(j) = Convert.ToInt32(txt.Substring(i - 1, 2), 16)
    9. Password &= Convert.ToChar(DecimalHex(j) Xor MagicBytes(j)).ToString()
    10. Next
    11. Return Password
    12. End Function
    Und das hier produziert eine Fehlermeldung?

    VB.NET-Quellcode

    1. For i As Integer = 0 To txt.Length - 1 Step 2
    2. ...
    3. DecimalHex(j) = Convert.ToInt32(txt.Substring(i, 2), 16)
    4. ...
    5. Next


    i kann doch hier den Wert 16 nicht erreichen, oder irre ich mich da?

    ponmalka schrieb:

    oder irre ich mich da?
    Woraus ergibt sich denn das maximale i?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ponmalka schrieb:

    Und das hier produziert eine Fehlermeldung?

    VB.NET-Quellcode

    1. For i As Integer = 0 To txt.Length - 1 Step 2
    2. ...
    3. DecimalHex(j) = Convert.ToInt32(txt.Substring(i, 2), 16)
    4. ...
    5. Next


    i kann doch hier den Wert 16 nicht erreichen, oder irre ich mich da?


    Du hast ja quasi genau das von RFG übernommen.

    Und nein, es funktioniert nicht.

    Kann auch nicht, da das Maximum 16 ist und i=16 wird, was ich beim Debuggen gesehen habe
    -> Da Arrays nullbasiert wird also das nicht existiertende 17. Feld angesprochen.

    Hab einfach bei 1 angefangen da ja :
    die eine Variable index nutzt und die zweite index -1.
    Natürlich muss man dann entsprechend
    auch am Ende wieder eins abziehen -> Da das beim Array ja sowieso -1 ist, kommt man auf -2.

    Daniel Baumert schrieb:

    Da Arrays nullbasiert wird also
    i trotzdem durch die Textlänge bestimmt.
    Wenn der Text aus einer ungeraden Anzahl von Zeichen besteht, knallt es, weil txt.Substring(i, 2) dann ins Leere greift.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Daniel Baumert schrieb:

    sonst
    schmeiß das Array raus, das ist nicht erforderlich und überwach die Textlänge.

    VB.NET-Quellcode

    1. Private Function Doit(D As String) As String
    2. Dim MagicBytes As Byte() = {1, 2, 3}
    3. Dim Password As String = String.Empty
    4. Dim txt As String = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(D))
    5. If txt.Length Mod 2 <> 0 Then
    6. txt &= "0"
    7. ' oder was äquivalentes
    8. End If
    9. If txt.Length > 32 Then
    10. ' noch was tun
    11. End If
    12. For i As Integer = 1 To txt.Length - 1 Step 2
    13. Dim j As Integer = i \ 2
    14. Dim val = Convert.ToInt32(txt.Substring(i - 1, 2), 16)
    15. Password &= Convert.ToChar(val Xor MagicBytes(j)).ToString()
    16. Next
    17. Return Password
    18. End Function

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also @RodFromGermany, das klappt so auch nicht mit dem Index. Ich muss bei der Schleife txt.length -2 schreiben, damit kein Fehler auftritt.

    Aber es ist die Frage, ob das überhaupt sinnvoll ist. Einfach eine 0 dranhängen?.

    Ich meine: Vom ursprünglichen Inputstring , da wird doch sowieso für jedes einzelne Zeichen zwei Zeichen zur
    Darstellung verwendet. Von daher kann die Anzahl doch eigentlich nicht ungerade werden?

    Ich hab jetzt folgendes geschrieben:

    VB.NET-Quellcode

    1. Private Function Doit(D As String) As String
    2. Dim MagicB As Byte() = {1,2,3}
    3. Dim Password As String = String.Empty
    4. Dim txt As String = Encoding.UTF8.GetString(Convert.FromBase64String(x))
    5. If txt.Length Mod 2 <> 0 Then txt = String.Join(String.Empty, txt.Take(txt.Length - 1))
    6. For i As Integer = 1 To txt.Length - 2 Step 2
    7. Dim j As Integer = i \ 2
    8. Dim val As Integer = Convert.ToInt32(txt.Substring(i - 1, 2), 16)
    9. Password &= Convert.ToChar(val Xor MagicB(j)).ToString()
    10. Next
    11. Return Password
    End Function

    Daniel Baumert schrieb:

    damit kein Fehler auftritt.
    Poste mal einen relevanten Base64String.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!