Rolf b: php: file(...) : Format der Datei?

Beitrag lesen

Klar wird da gepackt - wenn aus dem String -126 (4 Bytes) auf einmal nur noch ein Byte wird. Nicht jedes Packen findet Huffman-codiert statt...

<anekdote>"Mein" alter IBM Großrechner von 1965 kannte gepackte Zahlen zum Rechnen und unterstützte die sogar im Assembler - da wurde jede Dezimalziffer in ein Halbbyte gepackt und das Vorzeichen kam als Hex-Wert von A-F ins letzte Halbbyte hinein (Regel: DB macht Minus, CAFE macht Plus, gilt auch heute noch :D)</anekdote>

Prinzipiell hast Du natürlich recht; so kann man es machen. Das Ergebnis ist vermutlich das kompakteste und die Ausführungsgeschwindigkeit die höchste. Es hat aber ein paar Nachteile:

  • Fritz muss es selbst programmieren und testen.
  • Die Ausgabedatei ist spezifisch für diesen Zweck formatiert, es ist kein generisches Format.
  • Die Ausgabedatei ist nicht menschenlesbar, man braucht einen Hex-Viewer/Editor und muss das Format exakt im Kopf haben. Knapp vorbeigepatcht ist auch ein Error.
  • Binärzahlen sind plattformspezifisch (Big/Little Endian), was Fritz vermutlich egal ist.
  • An Floats will ich gar nicht erst denken, zumindest nicht ohne einen Hexeditor der das Format kennt.

Dagegen ist das hier doch deutlich eleganter, und wenn man unbedingt kompakt speichern will, kann man es auch noch zippen...

$test = [ 4711 => true, 815 => [ false, true, [ 4,7,1 ] ] ];

$ser = serialize($test);
$jsn = json_encode($test);
$zip = gzdeflate($jsn, 9);

echo strlen($ser) . " - " . $ser . "\n";
echo strlen($jsn) . " - " . $jsn . "\n";
echo strlen($zip) . " - " . $zip . "\n";

ergibt:

79 - a:2:{i:4711;b:1;i:815;a:3:{i:0;b:0;i:1;b:1;i:2;a:3:{i:0;i:4;i:1;i:7;i:2;i:1;}}}
40 - {"4711":true,"815":[false,true,[4,7,1]]}
39 - (binärsalat)

Vorteil ist, dass es ohne eigene Mitarbeit typsicher ist und zur Not mit einem Texteditor manipuliert werden kann. Wenn einem Serialize oder JSON nicht gefallen, gibt's auch noch YAML, das muss man sich nur erstmal reinPECLn. Das INI Dateiformat, wie schon mal vorgeschlagen, lässt sich mit parse_ini_file() lesen, aber es gibt keinen fertigen Writer dafür (oder ich finde keinen).

Langer Rede, kurzer Sinn: Am besten speichert man es in einer SQL Server Tabelle :-)

Rolf