diff --git a/lab3/report/report.tex b/lab3/report/report.tex index 43bb2fe..0fb4df9 100644 --- a/lab3/report/report.tex +++ b/lab3/report/report.tex @@ -240,6 +240,30 @@ decryptCaesar alphabet shift = \end{lstlisting} + \subsection{Представление текста в виде последовательности бит} + + Код функций для преобразования текста в последовательность бит и обратно представлен в листинге~\ref{lst:bit}. Функция \texttt{textToBits} принимает текст в виде строки и возвращает его представление в виде вектора бит. Она использует вспомогательную функцию \texttt{charToBits}, которая преобразует символ в список бит, представляющих его код ASCII в двоичном виде. Для преобразования последовательности бит обратно в текст используется функция \texttt{bitsToText}. Она рекурсивно делит вектор бит на блоки по 8 бит, преобразует каждый блок в символ ASCII и объединяет их в строку. В процессе этого преобразования используется функция \texttt{bitsToInt}, которая преобразует вектор бит в целое число, интерпретируя их как двоичное представление этого числа. + + +\begin{lstlisting}[caption={Функции для конвертации текста в последовательность бит и обратно.}, label={lst:bit}] +textToBits :: String -> VU.Vector Int +textToBits text = VU.fromList $ concatMap charToBits text + +charToBits :: Char -> [Int] +charToBits c = [if testBit (ord c) i then 1 else 0 | i <- [7,6..0]] + +bitsToText :: VU.Vector Int -> String +bitsToText bits + | VU.null bits = [] + | otherwise = (chr $ bitsToInt (VU.take 8 bits)) : bitsToText (VU.drop 8 bits) + +bitsToInt :: VU.Vector Int -> Int +bitsToInt bits = + sum [bit * (2 ^ index) | (bit, index) <- zip (VU.toList bits) [len,(len - 1)..0]] + where + len = VU.length bits - 1 +\end{lstlisting} + \newpage \section {Результаты работы программы}