eine php Funktion in VB

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    eine php Funktion in VB

    Hallo,

    gleich mal vorweg: ich bin neu in der Welt von VB, habt gnade mit mir ;)

    möchte gerne folgende funktion in VB zum laufen bekommen, ich sag mal sie läuft ja auch schon, nur nicht so wie es soll.

    PHP Funktion:

    PHP-Quellcode

    1. function getMD5($modFile){
    2. $info = pathinfo($modFile);
    3. $fileContent = file_get_contents($modFile);
    4. $fileContent .= basename($modFile, '.' . $info['extension']);
    5. return md5($fileContent);
    6. }


    Bevor gefragt wird, wozu man es braucht: (kurz gefasst) ein Spiel benutzt Mods die werden dort mit ein MD5 hash kontrolliert ob jeder Spieler die selben/gleichen/identischen Mods auch hat.
    Mit dem Script kann man auf einer Seite die Mods anbieten den MD5 hash angeben dieser ist auch Identisch mit dem schon im Spiel vorhandenn wenn es sich um den 100% gleichen handelt. Es handelt sich um zip Datein.
    Und das gleiche soll auch lokal(die zip's sind also auf den Rechner) mit dem VB Programm passiere.

    Nun meine bisherige Funktion in VB

    VB.NET-Quellcode

    1. Public Function MD5Hash(sFile As String) As String
    2. Dim MD5 As New MD5CryptoServiceProvider
    3. Dim Hash As Byte()
    4. Dim Result As String = ""
    5. Dim Tmp As String = ""
    6. Dim FN As StreamReader = New StreamReader(sFile, Encoding.ASCII)
    7. Dim l As String
    8. l = FN.ReadToEnd()
    9. l &= datei_l 'datei_l Private Variable mit dem Dateinamen ohne .EXT
    10. Dim ll() As Byte
    11. ll = Encoding.ASCII.GetBytes(l)
    12. MD5.ComputeHash(ll)
    13. FN.Close()
    14. Hash = MD5.Hash
    15. For i As Integer = 0 To Hash.Length - 1
    16. Tmp = Hex(Hash(i))
    17. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    18. Result += Tmp
    19. Next
    20. Return Result
    21. End Function


    Der MD5 Hash wird übergeben und angezeigt, soweit so gut, nur es ist leider der Falsche.
    Wenn man in PHP sowie im VB Script den Teil mit dem Anhängen des Dateinamens wegläst dann ist es der gleiche Hash.
    Das PHP Script ist aber richtig da mir dort der selbe Hash angezeigt wird wie im Spiel.

    Interssanterweise wird mir der MD5 bei beiden identisch angezeigt wenn es sich um eine TXT Datei handelt. Nur leider nicht bei zip, oder einer anderen.

    Muss man in VB noch irgend etwas machen damit das Funktioniert hab mich schon zu tode gesuchmaschint aber leider nichts entsprechndes gefunden.
    Hoffe hier kann mir jemand helfen.

    Gruß
    Hugoo00
    Du magst also einen String in einem MD5 Hasch Konvertieren ? wenn ja , dann versuche mal das

    VB.NET-Quellcode

    1. Public Shared Function md5Crypto(key As String)
    2. Dim md5 As New MD5CryptoServiceProvider
    3. Dim Data As Byte()
    4. Dim Result As Byte()
    5. Dim Ausgabe As String = Nothing
    6. Data = Encoding.ASCII.GetBytes(key)
    7. Result = md5.ComputeHash(Data)
    8. For i = 0 To Result.Length - 1
    9. Ausgabe = Ausgabe & Hex(Result(i))
    10. Next
    11. Return Ausgabe.ToLower
    12. End Function
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    @Andy16823:
    Er will den md5 Hash einer Zip Datei und nicht eines Strings:

    Versuchs damit:

    VB.NET-Quellcode

    1. Imports System.Security.Cryptography
    2. Imports System.Text
    3. Imports System.IO
    4. Public Function MD5FileHash(ByVal sFile As String) As String
    5. Dim MD5 As New MD5CryptoServiceProvider
    6. Dim Hash As Byte()
    7. Dim Result As String = String.Empty()
    8. Dim Tmp As String = String.Empty()
    9. Dim FN As New FileStream(sFile, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
    10. MD5.ComputeHash(FN)
    11. FN.Close()
    12. Hash = MD5.Hash
    13. For i As Integer = 0 To Hash.Length - 1
    14. Tmp = Hex(Hash(i))
    15. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    16. Result += Tmp
    17. Next
    18. Return Result
    19. End Function
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Hier nochmal ein wenig kompakter:

    VB.NET-Quellcode

    1. Private Function GetMD5(sFile As String) As String
    2. Dim Res() As Byte = New System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(IO.File.ReadAllBytes(sFile))
    3. Return BitConverter.ToString(Res).Replace("-", "")
    4. End Function
    mit

    VB.NET-Quellcode

    1. FileStream


    hab ich das auch schon probiert nur wie komm ich da jetzt noch den Dateinamen dran, das ging immer nur mit StremRead und dann var = ReadToEnd() var &= ...

    weil im PHP Script wird noch der .= Dateiname(basename() ) angehangen und dann erst MD5 durch laufen
    Den gibst du doch beim Aufrufen der Funktion an..
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    PHP:

    var = file_get_content(pfad)

    eine Datei wird in var als string eingelesen, dann wird an dem ausgelessenen Wirwar noch der dateiname rangehangen

    var .= basename(...)

    und daraus wird dann der MD5 gebildet

    so wie es ja auch in dem VB script oben zu lesen ist wird an dem augelesenen l = ReadToEnd() (datei wird als string ausgelesen) und mit l &= datei_l noch der dateiname rangehangen, was aber auch nichtder richtige MD5 ist, die anderen Scripte hier geben mir nur den MD5 von der Datei selber aus, das darf es aber nicht weil so der MD5 nicht übereinstimmt mit den originalen MD5.
    Ich glaub das müsste dann so funktionieren:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim filename As String = "D:\1.zip"
    3. Dim s As String = IO.File.ReadAllText(filename)
    4. s += IO.Path.GetFileName(filename)
    5. MessageBox.Show(GetMD5(s))
    6. End Sub
    7. Private Function GetMD5(str As String) As String
    8. Dim Res() As Byte = New System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(System.Text.Encoding.UTF8.GetBytes(str))
    9. Return BitConverter.ToString(Res).Replace("-", "")
    10. End Function
    Die einzige Idee die ich grad noch hab, wäre das mal mit anderen Encodings zu versuchen, du hast im eröffnungspost ASCII verwendet, ich in meinem Beispiel UTF8.

    Edit: @Hugoo00: bei IO.File.ReadAllText(filename, System.Text.Encoding.ASCII) kann du auch das Encoding festlegen.

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

    ja hab mich schon gewundert warum der Hash auf einmal nen ganz andere war, mit ASCII ist er zumindest wieder der wie bei mir aber leider trotzdem nicht der richtige, die Datein sind aber auch ACSII.

    wenn ich mir die eingelesen datei anzeigen lassen will dann werden auch nur die ersen 4 Zeichen angeziegt laut Length hat sie aber über 68k Zeichen, wollte mir die letzten 100 anzeigen lassen ob auch der dateiname richtig hinten dran gehangen wird, also Substring(d.Length - 100) geht nicht da Index nicht kleiner als 0 sein darf.

    gibt es irgend wie eine C++ Funktion die das selbe macht wie das php Script weil das spiel ist bestimmt in C oder C++, dann könnte man vielleicht von C++ zu VB ableiten

    ?( ?(
    Hänge mal den aktuellen QT ran:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private verzeichnis As StringPrivate
    3. Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim v As String
    5. v = "F:\VBTest"
    6. If Directory.Exists(v) ThenDirectory.SetCurrentDirectory(v)
    7. ElseMessageBox.Show("Fehler")
    8. End Ifverzeichnis = Directory.GetCurrentDirectory()
    9. Dim dateiliste = Directory.EnumerateFiles(verzeichnis)
    10. lstDateien.Items.Clear()
    11. For Each cF As String In dateiliste
    12. Dim fN = cF.Substring(verzeichnis.Length + 1)
    13. lstDateien.Items.Add(fN)
    14. Next
    15. End SubPrivate Sub lstDateien_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstDateien.SelectedIndexChanged
    16. Dim dateiinfo As String = ""
    17. Dim datei_l As String
    18. Dim dateipfad As String = verzeichnis & "" & lstDateien.SelectedItem
    19. Dim datei As String = IO.Path.GetFileName(dateipfad)
    20. Try
    21. datei_l = datei.Substring(0, datei.Length - 4)
    22. Dim s As String = IO.File.ReadAllText(dateipfad, Encoding.ASCII)
    23. s += datei_l
    24. dateiinfo &= "Dateiname1: " & datei_l & vbCrLf
    25. dateiinfo &= "Dateiname2: " & lstDateien.SelectedItem & vbCrLf
    26. dateiinfo &= "Datei vom: " & Directory.GetLastWriteTime(dateipfad) & vbCrLf
    27. dateiinfo &= "MD5: " & GetMD5(s) & vbCrLf
    28. lblDateiInfo.Text = dateiinfo
    29. Catch ex As ExceptionlblEr.Text = "Fehler aufgetretten: " & ex.Message
    30. End Try
    31. End Sub
    32. Private Function GetMD5(str As String) As StringDim Res() As Byte = New System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(System.Text.Encoding.ASCII.GetBytes(str))
    33. Return BitConverter.ToString(Res).Replace("-", "")
    34. End Function
    35.  End Class

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

    Hab kein VB installiert aber gibt ja Converter wie Sand am Meer.

    VB.NET-Quellcode

    1. private string GetMD5Hash(string FilePath)
    2. {
    3. using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
    4. {
    5. using (System.IO.Stream stream = System.IO.File.OpenRead(FilePath))
    6. { return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", ""); }
    7. }
    8. }


    Ich habs jetzt nicht mit deinem php -Snippet getestet, allerdings mit den Referenzwerten die mir onlinemd5.com geliefert hat.
    Hash der Datei ist schon richtig nur halt zip mit am ende angehangendem Dateiname und daraus den Hash (wie es auch das PHP script macht), ich hab das ja schon hinbekommen nur halt ist es nicht der richtige Hash den mir das VB Prog. raus schmeißt, das ist das Problem
    Ich hab mir jetzt dein php -Script angesehen und dabei ist mir aufgefallen das bei diesem die Dateiendung nicht mit übergeben wird. Ich hab dir jetzt die Funktion zurecht gemacht, getestet und sie funktioniert mit dem oben geposteten php -Script.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. private static string GetMD5Hash(System.IO.FileInfo fileInfo)
    2. {
    3. string strContent = System.IO.File.ReadAllText(fileInfo.FullName, Encoding.Default);
    4. strContent += System.IO.Path.GetFileNameWithoutExtension(fileInfo.FullName);
    5. using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
    6. { return BitConverter.ToString(md5.ComputeHash(System.Text.Encoding.Default.GetBytes(strContent))).Replace("-", ""); }
    7. }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fakiz“ ()

    Hab kein VB installiert aber gibt ja Converter wie Sand am Meer.
    Es ist c# ich hab im moment kein VB installiert.

    vb -Code mit Konverter konvertiert

    VB.NET-Quellcode

    1. Private Shared Function GetMD5Hash(fileInfo As System.IO.FileInfo) As String
    2. Dim strContent As String = System.IO.File.ReadAllText(fileInfo.FullName, Encoding.[Default])
    3. strContent += System.IO.Path.GetFileNameWithoutExtension(fileInfo.FullName)
    4. Using md5 As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create()
    5. Return BitConverter.ToString(md5.ComputeHash(System.Text.Encoding.[Default].GetBytes(strContent))).Replace("-", "")
    6. End Using
    7. End Function

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

    Oh dachte heute kommt keine Antwort mehr, hatte den Code mit mein Kenntnisstand mal irgendwie umgebaut und funktioniert auch, aber der CODE hier sieht natürlich etwas besser aus

    Währe nie auf die Idee gekommen fileinfo zu nehmen. :thumbup:

    und das mit den Converter hab ick da nicht so ganz verstanden was du meintest aber jetzt weis ich das

    Auf jedenfall es funktioniert jetzt so wie es soll, ich danke Dir für deine mühe.

    :thumbsup: :thumbsup: :thumbsup: