moved all encodings to bytestring in- and output
This commit is contained in:
		
							parent
							
								
									82aed9340c
								
							
						
					
					
						commit
						6ab4cbaa79
					
				| 
						 | 
				
			
			@ -37,6 +37,8 @@ import Data.Char (ord, chr, digitToInt, intToDigit)
 | 
			
		|||
import qualified Data.ByteString.Char8 as BC
 | 
			
		||||
import Data.ByteString (ByteString)
 | 
			
		||||
import qualified Data.ByteString as B
 | 
			
		||||
import Data.Bits ((.&.), shiftR)
 | 
			
		||||
import Data.List (unfoldr)
 | 
			
		||||
 | 
			
		||||
binaryToChar :: ByteString -> Char
 | 
			
		||||
binaryToChar binStr = chr $ binaryToInt (BC.unpack binStr)
 | 
			
		||||
| 
						 | 
				
			
			@ -47,10 +49,20 @@ binaryToInt binStr = foldl (\acc x -> acc * 2 + digitToInt x) 0 binStr
 | 
			
		|||
dec2 :: ByteString -> ByteString
 | 
			
		||||
dec2 input = BC.pack . map binaryToChar . BC.words $ input
 | 
			
		||||
 | 
			
		||||
-- charToBinary :: Char -> ByteString
 | 
			
		||||
-- charToBinary char = BC.pack $ replicate (7 - length binaryStr) '0' ++ binaryStr
 | 
			
		||||
--   where
 | 
			
		||||
--     binaryStr = intToBinary (ord char)
 | 
			
		||||
charToBinary :: Char -> ByteString
 | 
			
		||||
charToBinary char = BC.pack $ replicate (7 - length binaryStr) '0' ++ binaryStr
 | 
			
		||||
charToBinary char = BC.pack $ replicate (8 - length binaryStr) '0' ++ binaryStr
 | 
			
		||||
  where
 | 
			
		||||
    binaryStr = intToBinary (ord char)
 | 
			
		||||
    codePoint = ord char
 | 
			
		||||
    binaryStr = padToLength 8 (intToBinary' codePoint)
 | 
			
		||||
 | 
			
		||||
padToLength :: Int -> String -> String
 | 
			
		||||
padToLength len str
 | 
			
		||||
  | length str >= len = take len str
 | 
			
		||||
  | otherwise = replicate (len - length str) '0' ++ str
 | 
			
		||||
 | 
			
		||||
intToBinary :: Int -> String
 | 
			
		||||
intToBinary n = reverse $ decimalToBinary' n
 | 
			
		||||
| 
						 | 
				
			
			@ -58,5 +70,8 @@ intToBinary n = reverse $ decimalToBinary' n
 | 
			
		|||
    decimalToBinary' 0 = "0"
 | 
			
		||||
    decimalToBinary' m = let (q, r) = m `divMod` 2 in intToDigit r : decimalToBinary' q
 | 
			
		||||
 | 
			
		||||
intToBinary' :: Int -> String
 | 
			
		||||
intToBinary' n = reverse $ take 8 $ unfoldr (\x -> if x == 0 then Nothing else Just (intToDigit $ x .&. 1, x `shiftR` 1)) n
 | 
			
		||||
 | 
			
		||||
enc2 :: ByteString -> ByteString
 | 
			
		||||
enc2 input = BC.unwords . map charToBinary . BC.unpack $ input
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -142,7 +142,7 @@ encodeChunk [x1] = BC.pack $ map (BC.index base45Alphabet) [b, a]
 | 
			
		|||
encodeChunk _ = error "Invalid chunk length"
 | 
			
		||||
 | 
			
		||||
dec45 :: ByteString -> ByteString
 | 
			
		||||
dec45 encoded = B.pack $ map fromIntegral decodedBytes
 | 
			
		||||
dec45 encoded = B.pack decodedBytes
 | 
			
		||||
  where
 | 
			
		||||
    numericValues = map charToNumeric (BC.unpack encoded)
 | 
			
		||||
    groups = groupIntoThrees numericValues
 | 
			
		||||
| 
						 | 
				
			
			@ -162,8 +162,10 @@ toBase45 :: [Int] -> Int
 | 
			
		|||
toBase45 [c, d, e] = c + d * 45 + e * (45 * 45)
 | 
			
		||||
toBase45 _ = error "Invalid Base45 group"
 | 
			
		||||
 | 
			
		||||
fromBase45 :: Int -> [Int]
 | 
			
		||||
fromBase45 n = unfoldr (\x -> if x == 0 then Nothing else Just (x `mod` 256, x `div` 256)) n
 | 
			
		||||
-- fromBase45 :: Int -> [Int]
 | 
			
		||||
-- fromBase45 n = unfoldr (\x -> if x == 0 then Nothing else Just (x `mod` 256, x `div` 256)) n
 | 
			
		||||
fromBase45 :: Int -> [Word8]
 | 
			
		||||
fromBase45 n = reverse $ unfoldr (\x -> if x == 0 then Nothing else Just (fromIntegral $ x `mod` 256, x `div` 256)) n
 | 
			
		||||
 | 
			
		||||
bytesToChars :: [Int] -> [Char]
 | 
			
		||||
bytesToChars = map chr
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue