binaere Files
-
Moin zusammen,
ich suche gerade nach irgendwelchen Hilfen zu binären Files, finde aber nicht ganz das was ich will.
Ich habe diverse Strings mit einer variablen Länge zwischen 5 bis 15 Zeichen. Diese würde ich gerne in ein binäres File speichern. Egal wie Lange der String ist das max sind 15bytes, wenn er kleiner ist soll der Rest mit NUL aufgefüllt werden.
Gibt es dazu Funktionen die das unterstützen?
Vielen Dank im Vorraus!
-
Gibt es, aber sag uns doch erst einmal, in welcher Sprache der ganze Spaß geschehen soll ...
-
Oha, ja das waere sicher hilfreich
Ich versuche das in/mit PHP zu lösen.
-
z.B. so in etwa:
<?php $MyStrings = array('irgendwas', 'noch irgendwas', 'noch was'); $FileHandle = fopen('meinedatei.bin', 'ab'); flock($FileHandle, LOCK_EX); foreach($MyStrings as $CurrentString) { if(strlen($CurrentString) >= 15) { $CurrentString = substr($CurrentString, 0, 15); } else { $NeededWhitespaces = 15 - strlen($CurrentString); for($cnt = 0; $cnt < $NeededWhitespaces; ++$cnt) { $CurrentString .= ' '; } } print($CurrentString); fwrite($FileHandle, $CurrentString); } flock($FileHandle, LOCK_UN); ?>
Enthalten sind deine Strings aber hier immer noch im Klartext!
-
Vielen Dank erstmal!
Das der Text noch lesbar ist, ist nicht schlimm. Die Daten müssen nicht versteckt werden. Ich könnte auch ein Txt-File machen, aber das macht keinen Spass und fordert nicht
Ich nehme an man kann keine NULL Zeichen schreiben. Ich wollte erst fprintf benutzen aber das geht sowieso nur in php5... meine Idee war dass es in etwa so aussieht:
vorname00000000 //15 chars gesammt, die restlichen bytes mit NULL gefüllt
nachname0000000
spitzname000000
128 //ein byte mit wert 128
01 //Ein Short mit Wert 258
02 // immer noch short
vorname20000000
usw. usw.So könnte ich zB.gemütlich von einem Offset zum anderen springen und immer 48 Bytes lesen...
Abschneiden muss ich nix. Es werden immer nur 15 Zeichen bei Strings durchgelassen. Wobei ich mir die subString-Funktion gleich mal aufgeschrieben habe! Vielleicht brauche ich die ja mal
-
Deine Methodik setzt voraus, dass es sich um ANSI-Strings handelt; ab PHP6 werden aber proprietär immer mehr Unicode-Strings vorkommen, und dann ist dein Verfahren hinfällig.
Wenn es nur um das separierte Abspeichern von Daten geht, hilft dir vielleicht die explode()-Funktion weiter. Du musst dir nur eine eindeutige Zeichenkette als Trennzeichen überlegen, anhand derer du den String parsen kannst:
// Beispiel: // In der Datei steht folgender Text: // Ein String[::-::]Noch ein String[::-::]5[::-::]4755[::-::]0x00AC9F $FileContent = file_get_contents('file.txt'); $FileContent = explode('[::-::]', $FileContent); // An dieser Stelle hast du in $FileContent ein Array mit deinen Texten: // $FileContent[0] == "Ein String" // $FileContent[1] == "Noch ein String" // $FileContent[2] == "5" // [...]
-
Vielen Dank nochmals!
Ich wusste das mit ANSI und UNICODE nicht.
Ich hab bisher hauptsächlich mit C rumgespielt und da PHP doch sehr ähnlich "wirkt", sofort versucht das so zu lösen wie ich es normalerweise tun würde. Ich hab schon darüber nachgedacht fturncate zu missbrauchenIch denke ich werde die explode func. nutzen.
-
Hi, warum machst du das nicht etwas geschickter ??
du hast ein Objekt, welches du dann in eine Datei schreibst (nicht durch serialisierung), sondern direkt als binärdaten. dadurch kannst du es von externer software wiederum auslesen.
-
Ein bisschen code zum schreiben und lesen von integerwerten.
function wb_integer(integer) { return chr((integer & 0xff000000) >> 24). // write byte[1]
chr((integer & 0x00ff0000) >> 16). // write byte[2] chr((integer & 0x0000ff00) >> 8). // write byte[3]
chr(($integer & 0x000000ff)); // write byte[4]
}function rb_integer(int\_bytes) { return ord(int_bytes[0]) | ord(int\_bytes[1]) << 8 | ord(int_bytes[2]) << 16 | ord($int_bytes[3]) << 24;
}das kann entsprechend an short ..etc angepasst werden
-
Moin und danke für den Tip. Hab mir mal die Scripts in meinen NeedfullThings Ordner gelegt, im moment mach ich das ganze nun mit mySQL... aber mal kucken die DB mag mich irgendwie nicht so richtig... vielleicht werde ich doch wieder binär schreiben