Про биты
This commit is contained in:
@@ -240,6 +240,30 @@ decryptCaesar alphabet shift =
|
|||||||
\end{lstlisting}
|
\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
|
\newpage
|
||||||
\section {Результаты работы программы}
|
\section {Результаты работы программы}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user