none
PDF-Datei in 64K große Blöcke teilen vor einer Übertragung via TCP/IP RRS feed

  • Frage

  • Hallo

    Ich bräuchte bitte einen Rat bzw. Hilfe für folgendes Problem (bei dem ich nicht so viel Erfahrung habe):

    Ich muss über TCP/IP-Schnittstelle, PDF-Dokumente strukturiert übertragen. Die Anforderung die PDF-Datei in 64K großen Blöcken zu übertragen; d.h auch jeder Block bekommt eine fortlaufende Nummer in dieser Struktur.

    Wie kann ich denn eine PDF-Datei (oder generell eine Datei) auf 64K große Blöcke splitten / und wie weiß ich dann auch die Anzahl der Blöcke?

    Kann mir dazu bitte jemand weiterhelfen......

    Vielen Dank schon mal & schönen Gruß,

    Michael

    Donnerstag, 23. Juli 2020 16:24

Antworten

  • Hier mal ein Beispiel zum Verständnis 

    namespace ConsoleApp3 { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); var file = System.IO.File.ReadAllBytes(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.pdf")); byte[] block = new byte[65535]; List<string> list = new List<string>(); int total = 0; for (int i = 0; i < file.Length; i+= block.Length) { int length = block.Length; if (file.Length - i < length) length = file.Length - i; total += length; Array.Copy(file, i, block, 0, length); list.Add(Convert.ToBase64String(block));

    Array.Clear(block, 0, block.Length); } } } }

    Beachte dass der letzte Block kleiner sein kann und somit am ende x 0 vorhanden sind. 

    Bei stackoverflow gibt es zu diesem Thema noch mehr Möglichkeiten C# Splitting An Array



    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Freitag, 24. Juli 2020 12:44

Alle Antworten

  • Hallo Michael,

    TCP/IP macht genau das. Es splittet Daten in einzelnen Pakete, nummeriert sie und schickt sie zum Empfänger. Damit ist immer gewährleistet das Packet in der richtigen Reihenfolge und vollständig übertragen wurden. Die maximale Paketgröße eine TCP/IP Paketes beträgt 64k.

    Im Netzwerk gibt es aber noch andere Protokolle die eine andere Paketgröße haben, somit wird dein Paket auf dem weg zum Empfänger wiederum gesplittet.

    Du könntest die ganze PDF-Datei mit System.IO.File.ReadAllBytes in den Arbeitsspeicher laden. Dann ein weiteres Byte[] mit 64K erzeugen und die ersten 4 Bytes für die Nummerierung und die Länge der Daten reservieren. Anbiete würde sich hier ein UInt16. Die Angabe der länge der Daten ist wichtig da das letzte Paket nicht den gesamten Block einnehmen wird. Den Rest des Blocks kannst Du für die Daten verwenden. 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Donnerstag, 23. Juli 2020 21:58
  • Hallo 

    Danke für Deine Rückmeldung. So ganz komme ich leider noch nicht weiter mit Deiner Antwort.

    Das Problem ist, dass strukturierte Strings erzeugen muss - die dann verschickt werden. Das PDF-Dokument in einem Byte[] hätte ich ja grundsätzlich im Arbeitsspeicher verfügbar.

    Ich müsste das Byte[] dann auf die vorgegebene Struktur splitten und das nur in 64K großen Blöcken.

    Es könnte nämlich auch sein, dass nicht über TCP/IP verschickt wird, sonder daraus eine Datei erzeugt wird - die dann der Normierung der Schnittstelle entspricht.

    Es würde mir helfen, ein kurzes Beispiel wie ich zumindest aus einem Byte[] 64K große Blöcke erzeugen kann.

    Danke vielmals & schönen Gruß,

    Michael

    Freitag, 24. Juli 2020 05:50
  • Hier mal ein Beispiel zum Verständnis 

    namespace ConsoleApp3 { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); var file = System.IO.File.ReadAllBytes(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.pdf")); byte[] block = new byte[65535]; List<string> list = new List<string>(); int total = 0; for (int i = 0; i < file.Length; i+= block.Length) { int length = block.Length; if (file.Length - i < length) length = file.Length - i; total += length; Array.Copy(file, i, block, 0, length); list.Add(Convert.ToBase64String(block));

    Array.Clear(block, 0, block.Length); } } } }

    Beachte dass der letzte Block kleiner sein kann und somit am ende x 0 vorhanden sind. 

    Bei stackoverflow gibt es zu diesem Thema noch mehr Möglichkeiten C# Splitting An Array



    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Freitag, 24. Juli 2020 12:44
  • Vielen Dank - das hilft mir sehr weiter.

    Schönen Gruß, Michael

    Samstag, 25. Juli 2020 06:30