§ Исходный код
Запускать требуется так:php bin2mif.php 32 in.bin out.mif
Где 32 — объем, 32Кб; in.bin — входящий файл; out.mif — исходящий. Можно опустить последний аргумент и будет выдано в stdout.
1<?php 2 3/* 4 * Конвертирование из Bin -> MIF файл 5 * Аргумент 1: Размер памяти (256k = 262144) 6 * Аргумент 2: bin-файл 7 * Аргумент 3: Куда выгрузить 8 */ 9 10$size = (int) $argv[1]; 11$data = file_get_contents($argv[2]); 12$len = strlen($data); 13if ($size < 1024) $size *= 1024; 14 15if (empty($size)) { echo "size required\n"; exit(1); } 16 17$out = [ 18 "WIDTH=8;", 19 "DEPTH=$size;", 20 "ADDRESS_RADIX=HEX;", 21 "DATA_RADIX=HEX;", 22 "CONTENT BEGIN", 23]; 24 25$a = 0; 26 27// RLE-кодирование 28while ($a < $len) { 29 30 // Поиск однотонных блоков 31 for ($b = $a + 1; $b < $len && $data[$a] == $data[$b]; $b++); 32 33 // Если найденный блок длиной до 0 до 2 одинаковых символов 34 if ($b - $a < 3) { 35 for ($i = $a; $i < $b; $i++) $out[] = sprintf(" %X: %02X;", $a++, ord($data[$i])); 36 } else { 37 $out[] = sprintf(" [%X..%X]: %02X;", $a, $b - 1, ord($data[$a])); 38 $a = $b; 39 } 40} 41 42if ($len < $size) $out[] = sprintf(" [%X..%X]: 00;", $len, $size-1); 43$out[] = "END;"; 44$pb = join("\n", $out); 45 46// Сохранить информацию 47if (isset($argv[3])) file_put_contents($argv[3], $pb); else echo $pb;