.z (zlip) Entpacken

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    .z (zlip) Entpacken

    Guten Morgen,

    ich wollte eine .z File entpacken, leider bekomme ich es nicht hin überhaupt einen Ansatz zu finden da ich nicht weiß wie die Dateien Komprimiert wurden.
    Im Netz habe ich dazu ein Python Script gefunden, hier wurde der Import "zlib" genutzt, gibt es das auch für VB.Net?

    Hier mal den Code:

    VB.NET-Quellcode

    1. import struct
    2. import zlib
    3. import sys
    4. def str_to_l(st):
    5. eturn struct.unpack('q', st)[0]
    6. def z_unpack(src, dst):
    7. with open(src, 'rb') as f_src:
    8. with open(dst, 'wb') as f_dst:
    9. f_src.read(8)
    10. size1 = str_to_l(f_src.read(8))
    11. f_src.read(8)
    12. size2 = str_to_l(f_src.read(8))
    13. if(size1 == -1641380927):
    14. size1 = 131072L
    15. runs = (size2 + size1 - 1L) / size1 array = [] for i in range(runs):
    16. array.append(f_src.read(8)) f_src.read(8) for i in range(runs):
    17. to_read = array[i] compressed = f_src.read(str_to_l(to_read))
    18. decompressed = zlib.decompress(compressed) f_dst.write(decompressed)
    19. if __name__ == "__main__":
    20. z_unpack(sys.argv[1], sys.argv[2])


    Im Anhang habe ich zwei Dateien zum testen hochgeladen.

    Über Hilfe würde ich mich sehr freuen

    Danke
    Haufe

    PS: ich möchte kein C&P Code, ich möchte lernen ;)

    -->Hier<-- geht es zur Lösung
    Dateien
    • test.7z

      (1,62 kB, 117 mal heruntergeladen, zuletzt: )
    ähh? wasn das :)

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

    Es gibt tatsächlich eine zlib-Wrapper für .NET: dotzlib. Die Frage, die ich mir jetzt aber stelle ist: Ist es jetzt eine 7z-Datei (angehängt) oder eine mir unbekannte z-Datei (Threadtitel)? Für 7z-Dateien hat der Entwickler von 7-Zip auch eine Command-Line-Version rausgebracht, die du mit der Process-Klasse ansteuern kannst, was vmtl. einfacher und v.a. fehlerfreier ist, als das, was du da hast.

    LG :)
    So, habe nun ein wenig probiert, hier der Code:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.IO
    3. Public Class Form1
    4. <DllImport("zlib1.dll", CallingConvention:=CallingConvention.Cdecl)> _
    5. Private Shared Function compress(destBuffer As Byte(), ByRef destLen As UInteger, sourceBuffer As Byte(), sourceLen As UInteger) As Integer
    6. End Function
    7. <DllImport("zlib1.dll", CallingConvention:=CallingConvention.Cdecl)> _
    8. Private Shared Function uncompress(destBuffer As Byte(), ByRef destLen As UInteger, sourceBuffer As Byte(), sourceLen As UInteger) As Integer
    9. End Function
    10. Public Shared Function Compress(data As Byte()) As Byte()
    11. Dim _dLen As UInteger = CUInt(Math.Truncate((data.Length * 1.1) + 12))
    12. Dim _d As Byte() = New Byte(_dLen - 1) {}
    13. Compress(_d, _dLen, data, CUInt(data.Length))
    14. Dim result As Byte() = New Byte(_dLen - 1) {}
    15. Array.Copy(_d, 0, result, 0, result.Length)
    16. Return result
    17. End Function
    18. Public Shared Function Decompress(data As Byte()) As Byte()
    19. Dim _dLen As UInteger = 8192
    20. Dim _d As Byte() = New Byte(_dLen - 1) {}
    21. If uncompress(_d, _dLen, data, CUInt(data.Length)) <> 0 Then
    22. Return Nothing
    23. End If
    24. Dim result As Byte() = New Byte(_dLen - 1) {}
    25. Array.Copy(_d, 0, result, 0, result.Length)
    26. Return result
    27. End Function
    28. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    29. Dim filestream As New FileStream("c:\test.z", FileMode.Open)
    30. Dim filesize As Long = filestream.Length
    31. Dim buffer(filesize) As Byte
    32. filestream.Close()
    33. File.WriteAllBytes("c:\test.uncompress", Decompress(buffer))
    34. End Sub
    35. End Class


    Leider bekomme ich immer den Fehler

    Quellcode

    1. Ein Ausnahmefehler des Typs "System.ArgumentNullException" ist in mscorlib.dll aufgetreten.
    2. Zusätzliche Informationen: Der Wert darf nicht NULL sein.


    Der Fehler liegt in derZeile

    VB.NET-Quellcode

    1. ​If uncompress(_d, _dLen, data, CUInt(data.Length)) <> 0 ThenReturn NothingEnd If


    Danke für die Hilfe
    ähh? wasn das :)
    msdn.microsoft.com/de-de/libra…latestream(v=vs.110).aspx
    oder
    msdn.microsoft.com/de-de/libra…gzipstream(v=vs.110).aspx

    GZip arbeitet auf dem Deflatestream und der DeflateStream ist laut MSDN seit .Net 4.5 sogar basierend auf der zlib.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Guten Morgen,
    danke für die Antworten.
    Ich habe mir DeflateStream angeschaut, leider bekomme ich auch hier einen Fehler:

    VB.NET-Quellcode

    1. ​Ein Ausnahmefehler des Typs "System.IO.InvalidDataException" ist in System.dll aufgetreten.


    hier mein Code:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim directoryPath As String = "c:\"
    3. Dim directorySelected As New DirectoryInfo(directoryPath)
    4. Dim fileinfo As FileInfo = directorySelected.GetFiles("test.z")(0)
    5. Decompress(fileinfo)
    6. End Sub
    7. Public Shared Sub Decompress(fileToDecompress As FileInfo)
    8. Using originalFileStream As FileStream = fileToDecompress.OpenRead()
    9. Dim currentFileName As String = fileToDecompress.FullName
    10. Dim newFileName As String = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length)
    11. Using decompressedFileStream As FileStream = File.Create(newFileName)
    12. Using decompressionStream As New DeflateStream(originalFileStream, CompressionMode.Decompress)
    13. decompressionStream.CopyTo(decompressedFileStream)
    14. Console.WriteLine("Decompressed: {0}", fileToDecompress.Name)
    15. End Using
    16. End Using
    17. End Using
    18. End Sub


    MfG
    Haufe
    ähh? wasn das :)
    Die .z Datei ist irgend ein unbekanntes Datei Format, nicht nur ein Deflate Stream, aber es enthält einen Deflate Stream.
    Im Prinzip musst du nur den Python Code übersetzen(man kann sogar noch mehr über das Dateiformat herausbekommen).

    C#-Quellcode

    1. struct Header{
    2. ulong magic;//0xC1832A9E00000000
    3. ulong size1;
    4. ulong unknown;
    5. ulong size2;
    6. }


    runs dürfte die Anzahl der enthaltenen Dateien sein, dann kommt vmtl. eine Liste von file headern:

    C#-Quellcode

    1. struct FileHeader{
    2. ulong compressedSize;
    3. ulong uncompressedSize;
    4. }


    Nachdem diese header geladen wurde musst du nur noch deine Dateien Laden, die alle direkt hintereinander sind, die Größe der Daten kennst du ja bereits, du musst also pro file nur noch einen buffer an bytes lesen(compressedSize).
    Dann erst kommt der DeflateStream ins Spiel, der die Daten dekomprimiert(muss nicht über diesen Buffer gemacht werden, sollte theoretisch auch direkt auf dem stream funktionieren)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für die Antwort,
    leider verstehe ich nicht ganz den Script, ich versuche mal zu zeigen wie weit ich das verstehe oder auch nicht :D

    VB.NET-Quellcode

    1. with open(src, 'rb') as f_src:
    2. Dim src As FileStream = File.Open("c:\test.z", FileMode.Open)
    3. with open(dst, 'wb') as f_dst:
    4. Hier ist schon meine erste Frage:
    5. dst = Destination
    6. wb = write binary
    7. was gebe ich hier an bytes an:
    8. Dim dest As FileStream = File.WriteAllBytes("c:\test.un",?????)
    9. f_src.read(8) <-- was bewirkt diese Zeile, zweimal einlesen?
    10. size1 = str_to_l(f_src.read(8))<-- Hier wird die Dateigröße von byte in long konvertiert?
    11. Dim size1, size2 As Long
    12. size1 = CType(src.Length, Long)
    13. size2 = CType(src.Length, Long)
    14. f_src.read(8) <-- was bewirkt diese Zeile, zweimal einlesen?
    15. size2 = str_to_l(f_src.read(8)) <--- size1 == size2?
    16. if(size1 == -1641380927): <-- wie entsteht dieser Wert in size1?


    Danke für die Hilfe
    ähh? wasn das :)
    r/w t/b und ähnliche sind einfach alte C herangehensweißen um FileMode und FileAccess anzugehen.
    r=read
    w=writer
    t=text
    b=binary

    t/b werden auf Windows unterschieden(mir ist kein anderes OS bekannt, welches das auch macht). Der einzige Unterschied dabei ist, dass ein im TextMode geöffnetes File bei einem NewLine \n automatisch ein CarriageReturn vorranstellt um einen Windows konformen Zeilenumbruch zu erhalten: \r\n
    binary lässt dafür alles genauso wie man es raus schreibt.

    Die Frage ist, was hast du mit deinem destination File vor, warum sollte das über File.WriteAllBytes gehen? Mach es doch gleich wie beim source FileStream, jedoch brauchst du natürlich FileAccess.Write
    (guck dir die File.Open Überladungen an)

    Und wie bei deinem Code oben sollte jeder FileStream mit einem Using verwendet werden, sodass du auch sicher bist, dass er geschlossen wird.

    die reads ohne Zuweisung f_src.read(8) bewirken einfach nur, dass 8 bytes eingelesen und ignoriert werden, das würde ich nicht so machen, da wir vlt. irgendwann herausfinden können, wofür diese 8 bytes gut sind.
    Deshalb hab ich dir oben die structs geschrieben, die du instanzieren sollst und mit daten füllen.

    Um das ganze jetzt etwas einfacher zu machen fügst du einen BinaryReader auf den source fileStream hinzu.
    mit binaryReader.ReadUInt64() machst du dann genau dasselbe wie str_to_l(f_src.read(8)).

    Also nein size1/size2 sind nicht die Dateigröße.

    und -1641380927 entspricht zufälligerweiße exakt dem magic im header, das ist vlt. für den fall, dass eine Datei nochmal 8 vorherige Bytes zusätzlich hat, aber das ist schwer zu sagen, da wir so wenig über das Format Wissen, ist vlt auch unnötiger Blödsinn
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für die super Hilfe jvbsl,

    soweit bin ich jetzt gekommen:

    Visual Basic-Quellcode

    1. Private Structure Header
    2. Dim magic, size1, unknown, size2 As ULong
    3. End Structure
    4. Sub test()
    5. Dim fh As New Header
    6. Using src As FileStream = File.Open("c:\test.z", FileMode.Open)
    7. Using dest As FileStream = File.Open("c:\test.u", FileMode.Create, FileAccess.Write)
    8. Using reader As New BinaryReader(src)
    9. fh.size1 = reader.ReadUInt64
    10. fh.size2 = reader.ReadUInt64
    11. End Using
    12. End Using
    13. End Using
    14. End Sub


    Wie mache ich jetzt das Magic im Header muss ich das fest Definieren oder wird es berechnet, was ist mit "unknown" wie soll ich es definieren, und zum Schluss mit welcher Funktion soll ich es dekomprimieren?

    Viele Fragen :)

    Schönen Sonntag !
    ähh? wasn das :)
    Magic(hab ich nur so genannt, weil ich es vermute) ist in der Regel am Anfang einer Datei um zu verifizieren, dass es sich um den richtigen Dateityp handelt(Linux z.B. verwendet ansich gar keine Dateiendungen)
    In der Regel sind es auch nur die ersten 3-4 Bytes, aber da die folgenden 4 bytes nur 0en sind geh ich mal davon aus, dass das immer so sein wird.

    Dein aktueller Code stimmt noch nicht, der Python Code liest erst 8bytes ein, ohne diese in eine Variable zu speichern, dann size1, dann wieder 8 ohne variable und dann erst size2
    Genau in dieser Reihenfolge hab ich auch die header struct gestaltet

    erst Magic einlesen, dann size1, dann unknown und dann size2.
    Direkt nachdem du den Magic eingelesen hast würde ich noch den Magic Wert überprüfen, ob er dem HexWert(oben im Kommmentar) 0xC1832A9E00000000 entspricht. Es kann noch sein, dass du Aufgrund der Endianess was vertauschen musst, da komm ich immer durcheinander :D

    Dann musst du wie im obigen Python script noch die Runs berechnen.

    Anschließend ist die Frage, ob die Datei mehrere Dateien enthalten kann, oder die Dateien nur in Chunks unterteilt werden(für stremed reading evtl?)

    Wenn es sich immer nur um eine Datei handelt, dann müsste die 2te struct ChunkHeader oder ähnlich heißen anstelle von FileHeader.

    Dann erstellen wir ein Array von ChunkHeader/FileHeader mit anzahl runs an Elementen.
    Durchlaufen eine Schleife mit runs durchläufen und lesen dabei header ein.

    Anschließend noch einmal eine Schleife mit runs durchläufen um die Daten zu entschlüsseln(dazu kommen wir dann, wenn du den oberen Teil geschafft hast)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok,

    so hab das jetzt alles gemacht und verstehe wie das jetzt mit dem Header ist, vielen Dank dafür.

    Die Runs zu berechnen sollte kein Problem sein, aber :-), was bedeutet 1L?
    MfG

    VB.NET-Quellcode

    1. Private Structure Header
    2. Dim magic, size1, unknow, size2 As ULong
    3. End Structure
    4. Sub test()
    5. Dim fh As New Header
    6. Using src As FileStream = File.Open("c:\test.z", FileMode.Open)
    7. Using dest As FileStream = File.Open("c:\test.u", FileMode.Create, FileAccess.Write)
    8. Using reader As New BinaryReader(src)
    9. fh.magic = reader.ReadUInt64()
    10. fh.size1 = reader.ReadUInt64
    11. fh.unknow = reader.ReadUInt64()
    12. fh.size2 = reader.ReadUInt64
    13. Dim runs As ULong
    14. runs = (fh.size1 + fh.size2 - 1L) / fh.size1
    15. Dim array As New ArrayList
    16. For o As Integer = 0 To runs - 1 Step 1
    17. array.Add(reader.ReadUInt64)
    18. reader.ReadUInt64()
    19. For i As Integer = 0 To runs - 1 Step 1
    20. Dim to_read As Long = array(i)
    21. Dim compressed As Byte() = reader.ReadBytes(to_read)
    22. Decompress(compressed)
    23. Next
    24. Next
    25. End Using
    26. End Using
    27. End Using


    Entpacken geht jetzt schon mal^^
    ähh? wasn das :)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „haufe“ ()

    das L wird nicht benötigt, der Compiler ist schlau genug selbst raus zu finden, dass es sich um einen ULong handelt, wofür man eigt. UL verwenden würde. Also lass das L einfach weg, das machts find ich schöner.

    Deine Schleife ist falsch, du musst von 0 bis runs-1 machen, VB.Net ist da inklusiv.

    ArrayList ist böse, verwende dafür eine generische List(Of T)

    Außerdem meinte ich dass du in der Schleife genau dasselbe wie mit dem Header machst, nur eben für die FileHeader/ChunkHeader-struct.
    Die Zweite Schleife, die runs durchläuft ist außerdem außerhalb von der ersten Schleife.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    So okay?

    VB.NET-Quellcode

    1. Private Structure Header
    2. Dim magic, size1, unknow, size2 As ULong
    3. End Structure
    4. Private Structure daten
    5. Dim zahl As ULong
    6. End Structure
    7. Private Structure Fileheader
    8. Dim compressedSize As ULong
    9. Dim uncompressedSize As ULong
    10. End Structure
    11. Sub test()
    12. Dim filename As String = "c:\test.z"
    13. Dim zielfilenmame As String = "c:\test.uncompress"
    14. Dim h As New Header
    15. Dim fh As New Fileheader
    16. Using src As FileStream = File.Open(filename, FileMode.Open)
    17. Using dest As FileStream = File.Open(zielfilenmame, FileMode.Open)
    18. Using reader As New BinaryReader(src)
    19. h.magic = reader.ReadUInt64()
    20. h.size1 = reader.ReadUInt64
    21. h.unknow = reader.ReadUInt64()
    22. h.size2 = reader.ReadUInt64
    23. Dim runs As ULong
    24. runs = (h.size1 + h.size2 - 1) / h.size1
    25. Dim array As New List(Of daten)
    26. Dim uebergabe As New daten
    27. For o As Integer = 0 To runs - 1 Step 1
    28. uebergabe.zahl = reader.ReadUInt64
    29. array.Add(uebergabe)
    30. reader.ReadUInt64()
    31. Next
    32. For i As Integer = 0 To runs - 1 Step 1
    33. Dim to_read As Long = array(i).zahl
    34. Wie mache ich hier weiter um das Struct richtig zu definieren und wie bekomme ich die Größe von uncompressedSize ?
    35. Dim compressed As Byte() = reader.ReadBytes(to_read)
    36. Decompress(compressed, zielfilenmame)
    37. Next
    38. End Using
    39. End Using
    40. End Using
    41. End Sub
    ähh? wasn das :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „haufe“ ()

    Wir kommen der Sahe definitiv näher.

    Für so einen Fall würdest du eine List(Of ULong) verwenden, aber auch die soll es nicht sein
    Du sollst hier eine List(Of FileHeader) verwenden in der "For o" schleife ist dann das erste ReadUInt64 die compressedSize und das zweite die uncompressedSize.

    Und dann kannst du für Decompress einen DeflateStream nehmen, der auf einem MemoryStream arbeitet.
    (Evtl. geht es auch ohne MemoryStream indem du die Zeile 35 löschst und der DeflateStream direkt auf dem FileStream arbeitet, bin mir aber nicht sicher ob er das kann, wär aber weniger Overhead und sogar performanter)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hab jetzt getestet, komme hier aber nicht weiter:

    VB.NET-Quellcode

    1. Function decompressz(ByVal zfile As FileInfo) As Boolean
    2. Dim zielfilename As String = Path.GetFileNameWithoutExtension(zfile.FullName)
    3. Dim h As New Header
    4. Dim fh As New Fileheader
    5. Dim _dLen As UInteger = 8192
    6. Dim _d As Byte() = New Byte(_dLen - 1) {}
    7. Dim count As Integer
    8. Dim outputbyte() As Byte
    9. Using src As FileStream = File.Open(zfile.FullName, FileMode.Open)
    10. ' Using dest As FileStream = File.Open(zielfilenmame, FileMode.Open)
    11. Using reader As New BinaryReader(src)
    12. h.magic = reader.ReadUInt64()
    13. h.size1 = reader.ReadUInt64
    14. h.unknow = reader.ReadUInt64()
    15. h.size2 = reader.ReadUInt64
    16. Dim bytesout As Byte()
    17. Dim runs As ULong
    18. runs = (h.size1 + h.size2 - 1) / h.size1
    19. Dim array As New List(Of Fileheader)
    20. Dim uebergabe As New Fileheader
    21. For o As Integer = 0 To runs - 1 Step 1
    22. uebergabe.compressedSize = reader.ReadUInt64
    23. uebergabe.uncompressedSize = reader.ReadUInt64()
    24. array.Add(uebergabe)
    25. Next
    26. For i As Integer = 0 To runs - 1 Step 1
    27. Dim to_read As ULong = array(i).compressedSize
    28. Dim compressed As Byte() = reader.ReadBytes(to_read)
    29. Using ms As New MemoryStream(compressed)
    30. Using ds As New Compression.DeflateStream(ms, Compression.CompressionMode.Decompress)
    31. Using outputStream As New MemoryStream()
    32. und wie geht es weiter? :-)
    33. End Using
    34. End Using
    35. Dim fs As FileStream = File.OpenWrite(zielfilename)
    36. ' fs.Write(bytesout, _dLen, bytesout.Length)
    37. ' fs.Flush()
    38. ' fs.Close()
    39. End Using
    40. Next
    41. Return True
    42. End Using
    43. End Using
    44. ' End Using
    45. End Function
    ähh? wasn das :)
    Die Frage jetzt wäre noch, ob es mehrere Dateien enthalten kann, oder ob eine Datei in Chunks unterteilt wird, das kann man so nicht feststellen, dafür bräuchte man eine .z Datei, bei der runs > 1 ist.
    Falls du mehrere Dateien hast könntest du das ja schon mal ausprobieren und diese Datei dann auch hochladen.

    Dein outputStream ist ganz und gar unnötig.

    Gehen wir nun davon aus, dass es immer nur eine Datei enthält, dann musst du deinen FileStream für die OutputFile um deine Schleife der variable i machen.(Für Streams nach möglichkeit immer ein using verwenden)
    innerhalb des ds-usings musst du dann nur noch ein ds.CopyTo(fs) ausführen.

    Wenn es mehrere dateien enthalten kann, dann muss das using deines fs-Filestreams innerhalb des ds-usings(so wie aktuell dein MemoryStream, den du löschen sollst)
    zielfilename sollte dann vlt. eher etwas wie zielfilename + i.ToString() sein. Und dann geht es wieder gleich mit CopyTo.

    Dann fehlt nur immer noch die Validierung des Magic im header
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    So wie es scheint, ist es immer nur eine Datei die .z ist.Im ersten Thread hier ist die Datei schon hoch geladen und als 7zip gepackt, da sonst der Upload in das Forum nicht funktioniert.
    So habe ich es jetzt verstanden:

    VB.NET-Quellcode

    1. Dim zielfilename As String = Path.GetFileNameWithoutExtension(zfile.FullName)
    2. Dim h As New Header
    3. Dim fh As New Fileheader
    4. Dim _dLen As UInteger = 8192
    5. Dim _d As Byte() = New Byte(_dLen - 1) {}
    6. Dim count As Integer
    7. Dim outputbyte() As Byte
    8. Using src As FileStream = File.Open(zfile.FullName, FileMode.Open)
    9. Using reader As New BinaryReader(src)
    10. h.magic = reader.ReadUInt64()
    11. h.size1 = reader.ReadUInt64
    12. h.unknow = reader.ReadUInt64()
    13. h.size2 = reader.ReadUInt64
    14. Dim bytesout As Byte()
    15. Dim runs As ULong
    16. runs = (h.size1 + h.size2 - 1) / h.size1
    17. Dim array As New List(Of Fileheader)
    18. Dim uebergabe As New Fileheader
    19. For o As Integer = 0 To runs - 1 Step 1
    20. uebergabe.compressedSize = reader.ReadUInt64
    21. uebergabe.uncompressedSize = reader.ReadUInt64()
    22. array.Add(uebergabe)
    23. Next
    24. Using dest As FileStream = File.Open(zielfilename, FileMode.Create, FileAccess.Write)
    25. For i As Integer = 0 To runs - 1 Step 1
    26. Dim to_read As ULong = array(i).compressedSize
    27. Dim compressed As Byte() = reader.ReadBytes(to_read)
    28. Using ms As New MemoryStream(compressed)
    29. Using ds As New Compression.DeflateStream(ms, Compression.CompressionMode.Decompress)
    30. ds.CopyTo(dest)
    31. ds.Flush()
    32. ds.Close()
    33. End Using
    34. End Using
    35. Next
    36. Return True
    37. End Using
    38. End Using
    39. End Using


    Jetzt schau ich mal die Validierung vom Magic an, momentan gibt es mir den Wert "2653586369" zurück, wie soll ich jetzt vorgehen?
    ähh? wasn das :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „haufe“ ()