<?php require_once 'Huffman.php'; $huffman = new Huffman(); $string = $_REQUEST['string']; $encodedString = $huffman->encode($string); $decodedString = $huffman->decode($encodedString); $output = array('original' => $string, 'encoded' => $encodedString, 'decoded' => $decodedString, 'orLength' => strlen($string), 'encLength' => strlen($encodedString), 'percent' => strlen($encodedString) > 0 ? 100 - 100 * (strlen($encodedString) / strlen($string)) : 0); echo <<<EOF <p><strong>Код Хаффмана:</strong><br>{$output['encoded']}</p> <p><strong>Декодированное сообщение:</strong><br>{$output['decoded']}</p> <p><strong>Длина оригинала:</strong><br>{$output['orLength']}</p> <p><strong>Длина кода:</strong><br>{$output['encLength']}</p> <p><strong>Процент сжатия:</strong><br>{$output['percent']}</p> EOF ;
public static function GetSymbolStream($frequencies, $binary_stream) { $pos = 0; $symbol_stream = ''; $stream_length = strlen($binary_stream); while ($pos < $stream_length) { $codes = Huffman::GetCodes($frequencies->AsTable()); $longest = max(array_map('strlen', $codes)); $lookup_codes = array_flip($codes); $found = false; for ($length = $longest; $length > 0; $length--) { $check_digits = substr($binary_stream, $pos, $length); if (isset($lookup_codes[$check_digits])) { $symbol_stream .= $lookup_codes[$check_digits]; $frequencies->Adjust($lookup_codes[$check_digits], -1); $pos += $length; $found = true; break; } } if (!$found) { return false; } } return $symbol_stream; }
public static function decode($bits) { $result = Huffman::decodeTree($bits); $startIndex = $result[0]; $tree = $result[1]; $current = $tree->root; $s = ""; $i = $startIndex; while ($i < count($bits)) { if ($current->left && $current->right) { if ($bits[$i++]) { $current = $current->right; } else { $current = $current->left; } } else { if ($current->left || $current->right) { throw new Exception("Leaf must not have any children."); } $s .= $current->symbol; $current = $tree->root; } } if ($current->left || $current->right) { throw new Exception("Leaf expected at end of input."); } $s .= $current->symbol; return $s; }
if ($_FILES["filename"]["size"] > $maxFileSize) { $error = "File size exceed limit [{$maxFileSize}]"; include "../protected/view/form.php"; exit; } // Check if the file downloaded if (is_uploaded_file($_FILES["filename"]["tmp_name"])) { $uploadedFilePath = $filesDir . basename($_FILES["filename"]["name"]); move_uploaded_file($_FILES["filename"]["tmp_name"], $uploadedFilePath); } else { $error = "File is not uploaded to server"; include "../protected/view/form.php"; exit; } ob_start(); $huffman = new Huffman($uploadedFilePath); $operation = isset($_POST['operation']) ? $_POST['operation'] : Huffman::OPERATION_ENCODE; try { switch ($operation) { case Huffman::OPERATION_ENCODE: $huffman->encode(); break; case Huffman::OPERATION_DECODE: $huffman->decode(); break; } } catch (HuffmanException $e) { $error = $e->getMessage(); include "../protected/view/form.php"; exit; } catch (Exception $e) {
echo '<br />'; } } echo '<hr />'; echo '<h1>Ukázkové řetězce:</h1>'; $huffman = new Huffman(); $text = 'ABCDEAABCA'; $zakodovanyText = $huffman->zakoduj($text); $dekodovanyText = $huffman->dekoduj($zakodovanyText); echo 'Původní text : ' . $text . '<br />' . 'Zakódovaný text : ' . $zakodovanyText . '<br />' . 'Dekódovaný text : ' . $dekodovanyText . '<br />' . 'Původní délka : ' . strlen($text) . '<br />' . 'Délka po zakódování : ' . strlen($zakodovanyText) . '<br />' . 'Poměr : ' . (strlen($text) / strlen($zakodovanyText) - 1) * 100 . '%<br /><br />'; echo '<br/>'; $huffman = new Huffman(); $text = 'ABRAKADABRA'; $zakodovanyText = $huffman->zakoduj($text); $dekodovanyText = $huffman->dekoduj($zakodovanyText); echo 'Původní text : ' . $text . '<br />' . 'Zakódovaný text : ' . $zakodovanyText . '<br />' . 'Dekódovaný text : ' . $dekodovanyText . '<br />' . 'Původní délka : ' . strlen($text) . '<br />' . 'Délka po zakódování : ' . strlen($zakodovanyText) . '<br />' . 'Poměr : ' . (strlen($text) / strlen($zakodovanyText) - 1) * 100 . '%<br /><br />'; echo '<br/>'; $huffman = new Huffman(); $text = 'AAABBCDEEEEEEF'; $zakodovanyText = $huffman->zakoduj($text); $dekodovanyText = $huffman->dekoduj($zakodovanyText); echo 'Původní text : ' . $text . '<br />' . 'Zakódovaný text : ' . $zakodovanyText . '<br />' . 'Dekódovaný text : ' . $dekodovanyText . '<br />' . 'Původní délka : ' . strlen($text) . '<br />' . 'Délka po zakódování : ' . strlen($zakodovanyText) . '<br />' . 'Poměr : ' . (strlen($text) / strlen($zakodovanyText) - 1) * 100 . '%<br /><br />'; echo '<br/>'; $huffman = new Huffman(); $text = 'AAAAABBCDDDEF'; $zakodovanyText = $huffman->zakoduj($text); $dekodovanyText = $huffman->dekoduj($zakodovanyText); echo 'Původní text : ' . $text . '<br />' . 'Zakódovaný text : ' . $zakodovanyText . '<br />' . 'Dekódovaný text : ' . $dekodovanyText . '<br />' . 'Původní délka : ' . strlen($text) . '<br />' . 'Délka po zakódování : ' . strlen($zakodovanyText) . '<br />' . 'Poměr : ' . (strlen($text) / strlen($zakodovanyText) - 1) * 100 . '%<br /><br />'; ?> </body> </html>
echo 'Не могу найти файл архива!'; } // Папка куда распаковались файлы. $dir_unpack = $newname_unpack; // Получаем список файлов в ней. $f = scandir($dir_unpack); // Находим распакованный .txt файл. Присваиваем его переменной $dir_unpack_file. foreach ($f as $file) { if (preg_match('/\\.(txt)/', $file)) { $dir_unpack_file = $newname_unpack . "\\" . $file; // Считываем данные из файла, в перeменную $data_zip $data_zip = implode("", file($dir_unpack_file)); // Делаем компрессинг полученных данных $huffman3 = new Huffman(); $compressed = $huffman3->compress($data_zip); // Делаем декомпрессинг полученных данных $huffman4 = new Huffman(); $decompressed = $huffman4->decompress($compressed); // Записываем распакованные данные в файл $dir_unpack_file. $fp = fopen($dir_unpack_file, "w"); fwrite($fp, $decompressed); fclose($fp); } } // Переносим файл $dir_unpack_file в папку upload_unpack. Чтобы скачивание по ссылке "Скачать распакованный файл", производилось по правильному пути. rename($dir_unpack_file, $newname_unpack_name); // После переноса файла, удаляем временную папку с первоначальными, разархивированными данными. rmdir($newname_unpack); // Формируем JSON-запись, для передачи ее в js файл. echo json_encode($newname_unpack_name); }
<!DOCTYPE html> <html> <meta charset="UTF-8"> <body> <?php include 'huffman.php'; $freq = array(array('ə', '11.49'), array('n', '7.11'), array('r', '6.94'), array('t', '6.91'), array('ɪ', '6.32'), array('s', '4.75'), array('d', '4.21'), array('l', '3.96'), array('i', '3.61'), array('k', '3.18'), array('ð', '2.95'), array('ɛ', '2.86'), array('m', '2.76'), array('z', '2.76'), array('p', '2.15'), array('æ', '2.10'), array('v', '2.01'), array('w', '1.95'), array('u', '1.93'), array('b', '1.80'), array('e', '1.79'), array('ʌ', '1.74'), array('f', '1.71'), array('aɪ', '1.50'), array('ɑ', '1.45'), array('h', '1.40'), array('o', '1.25'), array('ɒ', '1.18'), array('ŋ', '0.99'), array('ʃ', '0.97'), array('y', '0.81'), array('g', '0.80'), array('dʒ', '0.59'), array('tʃ', '0.56'), array('aʊ', '0.50'), array('ʊ', '0.43'), array('θ', '0.41'), array('ɔɪ', '0.10'), array('ʒ', '0.07')); $freq = array(array('ə', '10.74'), array('ɪ', '8.33'), array('n', '7.58'), array('t', '6.42'), array('d', '5.14'), array('s', '4.81'), array('l', '3.66'), array('ð', '3.56'), array('r', '3.51'), array('m', '3.22'), array('k', '3.09'), array('e', '2.97'), array('w', '2.81'), array('z', '2.46'), array('v', '2'), array('b', '1.97'), array('aɪ', '1.83'), array('f', '1.79'), array('p', '1.78'), array('ʌ', '1.75'), array('eɪ', '1.71'), array('i', '1.65'), array('əʊ', '1.51'), array('h', '1.46'), array('æ', '1.45'), array('ɒ', '1.37'), array('ɔ', '1.24'), array('ŋ', '1.15'), array('u', '1.13'), array('g', '1.05'), array('ʃ', '0.96'), array('j', '0.88'), array('ʊ', '0.86'), array('ɑ', '0.79'), array('aʊ', '0.61'), array('ʤ', '0.6'), array('ɜ', '0.52'), array('ʧ', '0.41'), array('Ɵ', '0.37'), array('eə', '0.34'), array('ɪə', '0.21'), array('oɪ', '0.14'), array('ʒ', '0.1'), array('ʊə', '0.06')); var_dump(Huffman::GetCodes($freq)); ?> </body> </html>