Что-то вы все усложняете. Я уже решил эту задачу на PHP без 16-ичных кодов, так как они бинарный файл увеличат в 2 раза. Мой алгоритм увеличивает в 1.5 раз бинарный файл. Привожу исходники:
(Правда, имеется костыль: почему-то уничтожаются первые 2 байта, приходится добавлять, например, при раскодировании
архива rar, $param="Ra". Может потом исправлю этот глюк, но пока и с ним можно работать.)
Суть алгоритма в том, что бинарные коды переводятся в символы, допустимые для передачи через POST-запрос.
Затем раскодируется вновь в бинарный файл. Так есть ограничение на размер файла 320000 байта (при большем размере
функция выдает ошибку)
Может кто-нибудь улучшит алгоритм. Но для моих нужд и так сойдет.
[code lang=php] function KodirTextFileToBinarFile($fileread,$filewrite,$param) {
$data = $param.file_get_contents($fileread,false,NULL,1,320000); $counter = strlen($data);
$file = fopen($filewrite, 'wb'); $char1 = "";
for($i = 0; $i < $counter; ++$i) { $char2 = $data[$i]; echo $char2;
if (($char1=="!") or ($char1==""")) { if (($char1=="!") and ($char2=="!")) { $CharOut = 256; }
else { if ($char1==""") { fwrite($file, pack("C",ord($char2)+80)); } else { if ($char1=="!") {
fwrite($file, pack("C",ord($char2)-35));
} } $char1 = ""; }
}
else { if (($char2=="!") or ($char2==""")) { $char1 = $char2; } else { fwrite($file, $char2); } }
}
fclose($file);
}
function KodirBinarFileToTextFile($fileread,$filewrite) { $StrOut = ""; $CharOut = "";
$data = file_get_contents($fileread, NULL, NULL, 1, 320000); $counter = strlen($data);
for($i = 0; $i < $counter; ++$i) { $char = ord($data[$i]); $CharOut = byteToChar($char);
$StrOut = $StrOut.$CharOut; }
file_put_contents($filewrite, $StrOut);
}
function byteToChar($byte1) { $simv = '_';
if ((($byte1>34) and ($byte1<123)) or (($byte1>191) and ($byte1<256))) {
$simv = chr($byte1); } else { if ($byte1<35) { $simv = "!".chr($byte1+35); } else {
if ($byte1==256) { $simv = "!!"; } else { $simv = """.chr($byte1-80); } } } return $simv;
}[/code]
Но данная задача изначально решалась по не знанию о наличие функции base64 в PHP. По сути, произошло "изобретение велосипеда", причем худшего качества, так как base64 увеличивает файл на 30%, а мой алгоритм на 50%