You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell实现文本与ASCII码互转及文件处理技术问询

实现文本与ASCII码的双向转换(Haskell)

看起来你已经搞定了文件读取和行拆分的部分,接下来核心就是实现文本↔ASCII码的双向转换逻辑,还要能自动判断每一行该用哪种转换方向。我来帮你完善代码,一步步实现需求:

核心思路

我们需要先判断每一行输入是「纯数字串」(要转成文本)还是「普通文本」(要转成ASCII码串),然后分别实现两种转换函数:

  1. 文本转ASCII:把每个字符映射为对应的ASCII数字,拼接成字符串
  2. 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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:39:20