Dateien Teilen

  • C#

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

    Dateien Teilen

    Hallo, ich suche eine Möglichkeit größere Dateien in ein Base64 String imzuwandeln. Die Dateien haben eine Größe von 500mb bis 2 GB oder mehr. Ich dachte das ich die Pakete Teile bzw. Byteweise einlese und den Base64 String dann mit einem Stream Writer in die Ziel Datei Schreibe.
    Aber

    Datei Größe 2 584 121 000 bytes / 20 000 000 bytes = 129,206 Pakete die kann ich ja nicht in einer Schleife durchlaufen.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Warum denn nicht? Und warum willst du es in einzelne Chunks unterteilen? Codier doch einfach gleich die gesamte Datei in Base64.
    Wozu

    Andy16823 schrieb:

    ein Base64 String
    :?:
    Öffne die Datei binär und kopiere sie scheibenweise in n weitere Dateien.
    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!
    Danke für deine Antwort, aber

    creac schrieb:

    Codier doch einfach gleich die gesamte Datei in Base64.


    Wenn man aber keine 2 GB oder mehr RAM frei hat, geht das nicht.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Andy16823 schrieb:

    Danke für deine Antwort, aber

    creac schrieb:

    Codier doch einfach gleich die gesamte Datei in Base64.


    Wenn man aber keine 2 GB oder mehr RAM frei hat, geht das nicht.

    Codier halt stückweise und schmeiß die bereits verarbeiteten Daten nachm codieren und wegschreiben wieder ausm Arbeitsspeicher. Bei Base64 musst du halt nur drauf achten, dass du die Parts in 6-Bit-Schritten unterteilst (bzw. in 6er-Vielfachen, die restlos durch 8 teilbar sind, dann kannst du trotzdem mit bytes arbeiten.)

    Edit: Müssen natürlich 6-Bit-Schritte sein, nicht 7-Bit-Schritte!

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

    Andy16823 schrieb:

    Könte man auch jedes byte in ein Base64 String Umwandeln und in der Datei zusammensetzen ?

    versuch erstmal, Base64 zu verstehen.

    Base64 wandelt immer jeweils 3 Byte in 4 druckbare Zeichen um, indem es aus den 3 * 8 = 24 bit 4 Ganzzahlen < 64 (24 bit / 6 bit = 4, 6 bit können 64 Werte darstellen) bildet und diese ganzzahl dann druckbaren Zeichen zuordnet (26 Großbuchstaben + 26 Kleinbuchstaben + 9 Ziffern + 2 Sonderzeichen (+, /) = 64 Zeichen)

    Einen einzelnen Byte umzuwandeln würde also nicht gehen.

    Andere Frage: Wozu genau brauchst du das? Da gibt es sicherlich eine elegantere Lösung.
    @Andy16823 Erkläre mal bitte den Sinn dahinter. Warum die Daten künstlich aufblähen? Du kannst eine Datei beliebig teilen, die Bytes der jeweiligen Teile schreibst Du in eigene Datein und setzt sie dann wieder zusammen. Hier den Holzweg über Base64 zu gehen, ist nicht klug.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    @Andy16823 Erkläre mal bitte den Sinn dahinter. Warum die Daten künstlich aufblähen? Du kannst eine Datei beliebig teilen, die Bytes der jeweiligen Teile schreibst Du in eigene Datein und setzt sie dann wieder zusammen. Hier den Holzweg über Base64 zu gehen, ist nicht klug.

    Kann ja schon nen Grund haben, dass er Base64 nutzen will. Base64 wurde erfunden, um Binärdateien in druckbaren ASCII-Zeichen darzustellen, um sie per SMTP versenden zu können (denn SMTP war ursprünglich nur zum Versenden von ASCII-Zeichen gedacht). Hat aber noch viele weitere Anwendungsmöglichkeiten in ähnlicher Richtung, bspw. viel bei Webentwicklung, um Binärdaten per GET zu übergeben oder kleinere Bilder direkt in HTML darstellen zu können, um unnötige Requests zu vermeiden.
    Trotzdem hat jeder HTTP-Request Overhead, der gespart werden kann. Ist auch durchaus noch eine gängige Methode, ebenso wie z.B. Spritesheets aus dem selben Grund genutzt werden.
    Ja. Das könnte ich verstehen, wenn wir in Zeiten des (Telefon-)Modems leben würden. Wir haben mittlerweile alle schnelles Internet. Da sind die paar Bytes Overhead erst ab einigen Hundert Request spürbar. Siehe auch Rules Of Optimization
    Ja, das gibt Traffic. Nein, niemand mag die Drosselkom. ;)
    Mit freundlichen Grüßen,
    Thunderbolt

    timmi31061 schrieb:

    Ja. Das könnte ich verstehen, wenn wir in Zeiten des (Telefon-)Modems leben würden. Wir haben mittlerweile alle schnelles Internet. Da sind die paar Bytes Overhead erst ab einigen Hundert Request spürbar.
    Ja, das gibt Traffic. Nein, niemand mag die Drosselkom. ;)

    Dann hast du offensichtlich nicht mit mobilem Internet aufm Dorf zu kämpfen, dagegen ist jede ISDN-Verbindung 'n Traum, versprochen :D

    Ich finde auch das ganze wird n bisschen Off-Topic. TE möchte Base64 haben, soll er bekommen.
    Und warum in Base64?

    Warum nutzt du nicht bereits vorhandene Mittel? (TAR, ZIP)

    Wenn du es alleine machst, würde ich das so machen: Am Anfang der Datei erstmal einen Table mit Metadaten, z.B. im Format "Dateiname|Offset", darauf gefolgt ein festes Trennzeichen (|;) und dann die Binärdaten deiner Daten.

    Quellcode

    1. helloworld.txt|0
    2. myimage.jpg|13
    3. mydocument.pdf|539
    4. |;ab hier dann deine Binärdaten...

    Kannste dann ganz einfach deine Daten extrahieren, indem du vom Offset der gewünschten Datei (zuzüglich länge der Metadaten) bis zum Offset der folgenden (zzgl. Metadaten) liest. So in der Art macht tar das auch

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

    weil ich so das gewünschte format bekomme ich wüsste nicht, wie ich die Dateien, wenn ich die Bytes zusammenfüge wieder trennen kann
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    timmi31061 schrieb:

    So funktioniert TAR: lowlevel.eu/wiki/TAR

    Okay dann muss ich mich korrigieren, TAR hat keinen Table am Anfang, sondern Metaheader am Anfang jeder Binärdatei. Macht aber für das Vorhaben des TEs kaum Unterschied.