{- - BinConv.hs - - Paul Sanders, SRD. 1992 - - This module contains routines for converting numbers to and from a - number of binary digits. - -} module BinConv (codes_to_ascii, ascii_to_codes, dec_to_binx) where zeroes = '0' : zeroes -- dec_to_binx converts a decimal to a fixed number of binary digits -- dec_to_binx #binary-digits decimal-number = binary-string dec_to_binx :: Int -> Int -> String dec_to_binx x y = take (x - length bin_string) zeroes ++ bin_string where bin_string = dec_to_bin y dec_to_bin = reverse . dec_to_bin' dec_to_bin' 0 = [] dec_to_bin' x = (if (x `rem` 2) == 1 then '1' else '0') : dec_to_bin' (x `div` 2) codes_to_ascii :: [Int] -> [Int] codes_to_ascii [] = [] codes_to_ascii (x:y:ns) = x_div : ((x_rem * 16) + y_div) : y_rem : codes_to_ascii ns where (x_div, x_rem) = divRem x 16 (y_div, y_rem) = divRem y 256 codes_to_ascii [n] = [x_div , x_rem] where (x_div, x_rem) = divRem n 16 ascii_to_codes [] = [] ascii_to_codes (x:y:z:ns) = (x * 16) + y_div : (y_rem * 256) + z : ascii_to_codes ns where (y_div, y_rem) = divRem y 16 ascii_to_codes [x,y] = [(x * 16) + y_rem] where (y_div, y_rem) = divRem y 16 divRem x y = (x `div` y, x `rem` y) -- missing from PreludeCore ?