Schneller als Base64 ?

  • VB.NET

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

    Schneller als Base64 ?

    Einen wunderschönen guten abend liebe community :)

    1: gibt es etwas schnelleres als Base64 ?
    2: wenn ich einen film mit Base64 in einen string umwandle, macht er das nich, er bricht nach ner zeit ab, liegt das daran, das der string nicht viel abspeichernkann ??

    edit: // zu nr. 2
    folgende ausnahme kommt :

    VB.NET-Quellcode

    1. System.OutOfMemoryException

    ok das waren die wesentlichen fragen :)


    ich hoffe ihr helft mir :)

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

    1. [quatsch gelöscht] ... aber B64 ist normalerweise schnell genug!

    zu 2

    wenn ich einen film mit Base64 in einen string umwandle

    Deswegen ist 1. eigentlich egal, weil das ne ziemlich blöde Idee ist. Warum sollte man einen Film nach Base64 wandeln? Um ihn auszudrucken?

    dann du solltest du das streamen

    Die blockweise Umwandlung (Blöcke müssen bis auf den letzten ein vielfaches von 3 lang sein) dürfte da schon reichen. "Byte für Byte" umwandeln geht jedenfalls SO nicht ;)


    Weil: Base64 wandelt IMMER 3 Byte in 4 Byte um. Fall der Input nicht 3 Byte ist, werden "Füllzeichen" angehängt ("=" bzw "==").

    Nur falls das jemand missverstehen sollte!
    also ich wandle es um um es über meinen tcp server als Text zu senden,... die anderen clienten entfangen es und speichern es als film wieder am ... mit musik und bildern klappt das schon :)

    aber wei geht das mit dem schritt für schritt ?
    wenn du schon nen TCP Server hast, warum sendest du es dann nicht so wie es ist, Base64 macht das unnötig groß, über TCP kannst du ganz einfach einen Byte Array versenden...

    Wenn es denn trotzallem unbedingt sein muss, les das Video in 3er Byte packeten ein(bzw. einem vielfachen), dann übersetzt du jeweils diese Teile und sendest sie...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    na also du schickst deine Datei/Video z.B. so:

    VB.NET-Quellcode

    1. Dim buffer() As Byte = IO.File.ReadAllBytes("Video")
    2. deinNetworkStream.Write(buffer,0,buffer.Length)

    statt deinNetworkstream genügt auch der BaseStream deines StreamWriters...
    sofern das Video nicht zu groß für den Speicher ist sollte dies funktionieren und wenn du es verstehst, wirst du es auch für größere Videos umsetzen können...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    mhh
    also er kann es warscheinlich immer nioch nicht machen, da es zu groß ist ...

    hier die Fehler meldung :

    Quellcode

    1. System.IO.IOException wurde nicht behandelt.
    2. Message="In die Übertragungsverbindung können keine Daten geschrieben werden: Ein Socketvorgang konnte nicht ausgeführt werden, da dem System Pufferspeicher fehlte oder eine Warteschlange voll war."
    3. Source="System"
    4. StackTrace:
    5. bei System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) bei WindowsApplication2.Form1.Button1_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\KK\Eigene Dateien\Visual Studio 2008\Projects\TCP Datentransver Client\TCP Datentransver Client\Form1.vb:Zeile 103. bei System.Windows.Forms.Control.OnClick(EventArgs e) bei System.Windows.Forms.Button.OnClick(EventArgs e) bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) bei System.Windows.Forms.Control.WndProc(Message& m) bei System.Windows.Forms.ButtonBase.WndProc(Message& m) bei System.Windows.Forms.Button.WndProc(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.Run(ApplicationContext context) bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) bei WindowsApplication2.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81. bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() bei System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) bei System.Threading.ThreadHelper.ThreadStart()
    6. InnerException: System.Net.Sockets.SocketException
    7. ErrorCode=10055
    8. Message="Ein Socketvorgang konnte nicht ausgeführt werden, da dem System Pufferspeicher fehlte oder eine Warteschlange voll war"
    9. NativeErrorCode=10055
    10. Source="System"
    11. StackTrace:
    12. bei System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) bei System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
    13. InnerException:
    Wie gesagt, wenn du den Code verstanden hast, dann solltest du es selbst auch für größere Dateien umschreiben können, indem du es immer Bufferweiß einliest und auch schreibst...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ... tut mir leid .. ich hab mir des sehr klange angeguckt aber noch nicht wirklich verstanden ...

    VB.NET-Quellcode

    1. Dim buffer() As Byte = IO.File.ReadAllBytes("Video")

    der läd die gewünschte Datei in den "buffer()"

    VB.NET-Quellcode

    1. Streamw.Write

    und hier sendet er es über den Streamw an den Server

    VB.NET-Quellcode

    1. (buffer,0,buffer.Length)

    aber hiermit kann ich leider nichts anfangen ...
    also IO.File.ReadAllBytes liest eine Datei komplett ein und liefert die kompletten Daten als Byte-Array zurück...
    ein Byte ist eine Zahl zwischen 0 und 255, falls du das noch nicht weißt...

    Statt nun den ganzen Byte-Array zu versenden sendet man immer nur Blöcke in der größe von z.B. einem Kb...
    einlesen würde beim Video somit ungefähr so funktionieren:

    VB.NET-Quellcode

    1. Using fs As New IO.FileStream("Video",Open,Read)'öffnen der Datei
    2. Dim buffer(1024) As Byte
    3. While (fs.Read(buffer,0,buffer.Length) > 0)'liest Blockweiße solange ein, bis keine 1024 Bytes mehr vorhanden sind
    4. 'Hier kommt der senden Code rein...
    5. End While
    6. End Using'hier wird die Datei geschlossen

    ich hoffe den rest bekommste noch kombiniert...
    und falls du das jetzt immernoch nicht verstanden hast, dann solltest dir mal nen Grundlagen Buch schnappen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

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

    mhh .. son misst ^^ ich kann des ding einfach nicht wieder zusammensetzen :D
    ich hab beim empfang das hier ...
    ich muss das noch in ne while schleife packen, doch das schaff ich nicht sauber ...

    VB.NET-Quellcode

    1. Dim bla As Integer
    2. Dim wiegroß As Integer = streamr.Read()
    3. Dim buffer() As Byte
    4. stream.Read(buffer, bla, wiegroß)

    bzw...

    VB.NET-Quellcode

    1. While (stream.Read(buffer, bla, wiegroß))
    2. '... mhh ka was hier her kommt ...
    3. End While
    wie wärs mit dem Übersetzen des Senden Codes, nur etwas umschreiben, damit keine Null-Bytes gespeichert werden

    VB.NET-Quellcode

    1. Using fs As New IO.FileStream("Video",Open,Read)'öffnen der Datei
    2. Dim buffer(1024) As Byte
    3. Dim bytesToRead As Integer = buffer.Length
    4. While (bytesToRead > 0)'liest Blockweiße solange ein, bis keine 1024 Bytes mehr vorhanden sind
    5. Dim nBytesToRead As Integer
    6. nbytesToRead = stream.Read(buffer,0,Math.Min(bytesToRead,buffer.Length))
    7. fs.Write(buffer,0,bytesToRead)
    8. bytesToRead = nBytesToRead
    9. End While
    10. End Using'hier wird die Datei geschlossen

    den Code kann man sicher noch optimieren...
    außerdem kommt beim senden bei While glaube ich > 0 hin, da es sonst die letzten Bytes nicht ausliest...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---