Haskell实现文本与ASCII码互转及文件处理技术问询
实现文本与ASCII码的双向转换(Haskell)
看起来你已经搞定了文件读取和行拆分的部分,接下来核心就是实现文本↔ASCII码的双向转换逻辑,还要能自动判断每一行该用哪种转换方向。我来帮你完善代码,一步步实现需求:
核心思路
我们需要先判断每一行输入是「纯数字串」(要转成文本)还是「普通文本」(要转成ASCII码串),然后分别实现两种转换函数:
- 文本转ASCII:把每个字符映射为对应的ASCII数字,拼接成字符串
- ASCII数字串转文本:把数字串按0-127的ASCII范围拆分,再转成对应字符(这里要注意,ASCII码是1-3位数字,从后往前拆分更可靠)
完整代码实现
import Data.Char (ord, chr, isDigit) -- 判断字符串是否全为数字字符(用来区分转换方向) isDigitString :: String -> Bool isDigitString = all isDigit -- 普通文本 → ASCII码字符串 textToAscii :: String -> String textToAscii = concatMap (show . ord) -- 逻辑:遍历每个字符,用ord转成ASCII码整数,show转成字符串,最后拼接所有结果 -- ASCII码字符串 → 普通文本 asciiToText :: String -> String asciiToText = reverse . go . reverse where go "" = "" go s -- 先尝试取3位数字(反转后是前3位,对应原字符串的最后3位) | length s >= 3 = let num = read (take 3 s) :: Int in if num <= 127 && num >= 0 then chr num : go (drop 3 s) else go2 s -- 不足3位时尝试2位 | length s >= 2 = go2 s -- 只剩1位直接转换 | otherwise = chr (read s) : go "" go2 s = let num = read (take 2 s) :: Int in if num <= 127 && num >= 0 then chr num : go (drop 2 s) -- 2位也超出范围,取1位转换 else chr (read (take 1 s)) : go (drop 1 s) -- 处理单行的转换逻辑 convertLine :: String -> String convertLine line | isDigitString line = asciiToText line | otherwise = textToAscii line -- 批量处理多行输入 convertLines :: [String] -> IO () convertLines = mapM_ (putStrLn . convertLine) main :: IO () main = do content <- readFile "input.txt" let linesList = lines content convertLines linesList
代码说明&测试验证
针对你给出的测试用例:
- 输入
abz→ 输出9798122(a=97,b=98,z=122,拼接后得到结果) - 输入
z?→ 输出12263(z=122,?=63) - 输入
9798122→ 输出abz(从后往前拆分出122、98、97,反转后对应z→b→a,最终得到abz)
关键细节
- 用
isDigitString判断转换方向:纯数字串转文本,否则转ASCII码 asciiToText用反转字符串的技巧,确保拆分数字时优先匹配最长的有效ASCII码(3位),避免拆分错误- 加入了0-127的范围判断,确保只转换有效的ASCII码
内容的提问来源于stack exchange,提问作者Simonas D.
相关产品推荐
相关产品推荐

