added solveEnc function, so that you do not have to know which encoding has been used to decode it
This commit is contained in:
parent
6800552f65
commit
f21e343ef3
48
Main.hs
48
Main.hs
|
@ -33,7 +33,10 @@ import qualified Data.Bytes.Text.Ascii as ASCII
|
||||||
import Data.Bytes.Get (getWord64host)
|
import Data.Bytes.Get (getWord64host)
|
||||||
import Data.ByteString.UTF8 as BSU -- from utf8-string
|
import Data.ByteString.UTF8 as BSU -- from utf8-string
|
||||||
-- import Data.ByteString (singleton)
|
-- import Data.ByteString (singleton)
|
||||||
|
import GHC.Word (Word8)
|
||||||
import qualified Data.ByteString.Char8 as C
|
import qualified Data.ByteString.Char8 as C
|
||||||
|
-- Regex imports
|
||||||
|
import Text.Regex.TDFA
|
||||||
|
|
||||||
data Based = Decode {
|
data Based = Decode {
|
||||||
b91 :: Bool,
|
b91 :: Bool,
|
||||||
|
@ -51,7 +54,8 @@ data Based = Decode {
|
||||||
qp :: Bool,
|
qp :: Bool,
|
||||||
uu :: Bool,
|
uu :: Bool,
|
||||||
xx :: Bool,
|
xx :: Bool,
|
||||||
yenc :: Bool
|
yenc :: Bool,
|
||||||
|
solve :: Bool
|
||||||
}
|
}
|
||||||
| Encode {
|
| Encode {
|
||||||
b91 :: Bool,
|
b91 :: Bool,
|
||||||
|
@ -116,7 +120,7 @@ octToInt (x : xs) = x + 8 * octToInt xs
|
||||||
|
|
||||||
dec91 :: String -> String
|
dec91 :: String -> String
|
||||||
dec91 = C.unpack . B91.decode
|
dec91 = C.unpack . B91.decode
|
||||||
-- dec91 input =
|
|
||||||
-- case singleton . B91.decode input of
|
-- case singleton . B91.decode input of
|
||||||
-- Right decoded -> C.unpack decoded
|
-- Right decoded -> C.unpack decoded
|
||||||
-- Left _ -> "Error decoding Base91.\n"
|
-- Left _ -> "Error decoding Base91.\n"
|
||||||
|
@ -251,6 +255,42 @@ decy input =
|
||||||
|
|
||||||
ency :: String -> String
|
ency :: String -> String
|
||||||
ency = C.unpack . Y.encode . BSU.fromString
|
ency = C.unpack . Y.encode . BSU.fromString
|
||||||
|
|
||||||
|
base91Regex = "^[!-~]*$"
|
||||||
|
-- base85Regex = "^[A-Za-u0-9!\"#$%&((*+,-./;:<=@[]\\`]*$"
|
||||||
|
base64Regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$"
|
||||||
|
base58Regex = "^[1-9A-HJ-NP-Za-km-z]+$" -- incorrect
|
||||||
|
base32Regex = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=)?$"
|
||||||
|
base16Regex = "^[0-9A-FXx]*$"
|
||||||
|
|
||||||
|
solveEnc :: String -> String
|
||||||
|
solveEnc input =
|
||||||
|
-- let isBase91 = BSU.fromString input =~ base91Regex :: Bool
|
||||||
|
let isBase64 = BSU.fromString input =~ base64Regex :: Bool
|
||||||
|
isBase58 = BSU.fromString input =~ base58Regex :: Bool
|
||||||
|
isBase32 = BSU.fromString input =~ base32Regex :: Bool
|
||||||
|
isBase16 = BSU.fromString input =~ base16Regex :: Bool
|
||||||
|
base64Result = if isBase64 then "\nTrying base64:\n" ++ dec64 input else ""
|
||||||
|
base58Result = if isBase58 then "\nTrying base58:\n" ++ dec58 input else ""
|
||||||
|
base32Result = if isBase64 then "\nTrying base32:\n" ++ dec32 input else ""
|
||||||
|
base16Result = if isBase16 then "\nTrying base16:\n" ++ dec16 input else ""
|
||||||
|
results = filter (not . null) [base64Result, base32Result, base16Result]
|
||||||
|
in
|
||||||
|
if null results
|
||||||
|
then "Not able to solve the encoding.\n"
|
||||||
|
else unlines results
|
||||||
|
|
||||||
|
--
|
||||||
|
-- | input =~ base64Regex = dec64 input
|
||||||
|
-- | input =~ base32Regex = dec32 input
|
||||||
|
-- | otherwise = "Cannot decode: " ++ input
|
||||||
|
--
|
||||||
|
-- if BSU.fromString input =~ base64Regex :: Bool
|
||||||
|
-- then dec64 input
|
||||||
|
-- else "Not Base64.\n"
|
||||||
|
-- ++ if BSU.fromString input =~ base32Regex :: Bool
|
||||||
|
-- then dec32 input
|
||||||
|
-- else "Not able to solve the encoding.\n"
|
||||||
|
|
||||||
optionHandler Decode{b91=True} = dec91
|
optionHandler Decode{b91=True} = dec91
|
||||||
optionHandler Encode{b91=True} = enc91
|
optionHandler Encode{b91=True} = enc91
|
||||||
|
@ -284,6 +324,7 @@ optionHandler Decode{xx=True} = decxx
|
||||||
optionHandler Encode{xx=True} = encxx
|
optionHandler Encode{xx=True} = encxx
|
||||||
optionHandler Decode{yenc=True} = decy
|
optionHandler Decode{yenc=True} = decy
|
||||||
optionHandler Encode{yenc=True} = ency
|
optionHandler Encode{yenc=True} = ency
|
||||||
|
optionHandler Decode{solve=True} = solveEnc
|
||||||
|
|
||||||
decodeMode :: Based
|
decodeMode :: Based
|
||||||
decodeMode = Decode {
|
decodeMode = Decode {
|
||||||
|
@ -302,7 +343,8 @@ decodeMode = Decode {
|
||||||
qp = def &= help "decode quoted-printable",
|
qp = def &= help "decode quoted-printable",
|
||||||
uu = def &= help "decode uu",
|
uu = def &= help "decode uu",
|
||||||
xx = def &= help "decode xx",
|
xx = def &= help "decode xx",
|
||||||
yenc = def &= help "decode yEncode"
|
yenc = def &= help "decode yEncode",
|
||||||
|
solve = def &= help "solve encoding"
|
||||||
} &= help "Decode chosen base" &=auto
|
} &= help "Decode chosen base" &=auto
|
||||||
|
|
||||||
encodeMode :: Based
|
encodeMode :: Based
|
||||||
|
|
Loading…
Reference in New Issue