Laden...

Wie Seperator/Delimiter in Binarfile einfügen

Erstellt von Christoph K. vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.421 Views
Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 6 Jahren
Wie Seperator/Delimiter in Binarfile einfügen

verwendetes Datenbanksystem: FlatFile

Hallo zusammen,

ich habe eine Datei, die Datensätze enthält, die unter anderem auch Binardaten enthalten. Die Datensätze sind auf Grund eines variablen Strings nicht immer gleichlang.

Nun möchte ich beim Auslesen der Datensätze, diese gerne seperieren können. Mein Problem ist nur, dass ich auf Grund der Verwendung von Binärdaten, keinen geeigneten Seperator/Delimiter finde 😕

Wie würdet ihr das machen?

Gruß

4.938 Beiträge seit 2008
vor 6 Jahren

Bei Binärdaten würde ich vorher die Länge davorpacken.
Oder aber du verpackst die Binärdaten mittels Convert.ToBase64String (so wie es auch u.a. bei Mails gemacht wird).

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Christoph K.,

das mit der Länge -- wie von Th69 vorgeschlagen -- ist sicherlich die beste Lösung. Wird bei HTTP mit der ContentLength und bei anderen Protokollen auch erfolgreich eingesetzt.

Als weitere Alternative könntest du "Magic bytes" verwenden. Also eine Folge von Bytes, die sonst mit sehr hoher Wahrscheinlichkeit nicht vorkommen werden, und anhand dieser separieren.
Dabei muss beim Lesen allerdings jedes Byte geprüft werden. Bei der Variante mit der Länge kann der ganze "Block" auf einmal gelesen werden und das ist schon einfacher 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 6 Jahren

Das Problem ist, dass die Datei nicht sequentiell gelesen wird, sondern ich irgendwo anfangen muss.
Ich kann also nicht wirklich wissen, ob da, wo ich gerade reinpiekse Binärden oder sonst was ist.

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Christoph K.,

dann kommst du einen Header, der den Inhalt der Datei beschreibt, nicht umher.
In diesem Header kann dann z.B. stehen von wo bis wo od. von wo und welche Länge welche Daten stehen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

3.003 Beiträge seit 2006
vor 6 Jahren

Es gibt außerdem noch Spezifikationen, die bestimmte Bytefolgen vereinbaren. Ich mach mal ein einfaches Beispiel:

Tag: 0xDBFAFA
Tagformat: Tag, Länge, Inhalt
ByteArray: AC 44 5F 84 DB FA FA 01 CC A0 CB 64 7A

--> Tag beginnt bei Index 4, Länge ist 01 --> gesuchter Inhalt ist also 0xCC (0d204)

Du kannst also einfach lesen, sobald ein bekanntes Tag kommt, wertest du es aus und liest immer weiter. Der deutsche Standard für eTickets basiert auf so etwas ähnlichem.

LaTino
EDIT: musst natürlich sicherstellen, dass die Daten von einer Art sind, dass das Tag nicht durch Zufall durch die Daten gebildet wird.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 6 Jahren

Ich habe es jetzt so gelöst, indem ich Datenblöcke fester Größe erstellt habe.

Die Datenblöcke sind 32Byte groß. Wenn ein neuer Datenblock beginnt gibt es ein MagicByte 0x00.

Ein (einfacher) Datenblock sieht demnach so aus: [MagicByte|1B][StringLength|2B][RawId(long)|8B][Stringdata|21B]

Ist der String größer als die 21Byte die ihm im ersten Datenblock zur Verfügung stehen, wird einfach ein neuer Datenblock drangehangen. Dieser Datenblock hat dann im ersten Byte nicht das MagicByte 0x00, da dieses nicht im String vorkommt.