【问题标题】:What is the best way to convert a ByteString to an Int?将 ByteString 转换为 Int 的最佳方法是什么?
【发布时间】:2012-01-16 23:25:52
【问题描述】:

我在尝试读取 ByteString 时总是遇到以下错误:
Prelude.read: no parse

以下是在浏览器中呈现时会导致此错误发生的代码示例:

factSplice :: SnapletSplice App App
factSplice = do
    mbstr <- getParam "input" -- returns user input as bytestring
    let str = maybe (error "splice") show mbstr
    let n = read str :: Int
    return [X.TextNode $ T.pack $ show $ product [1..n]]

或者更简单:

simple bs = read (show bs) :: Int

由于某种原因,show bs 之后的结果字符串包含引号。 因此,为了解决该错误,我必须删除引号,然后删除 read 它。 我使用从互联网复制的以下功能来做到这一点:

sq :: String -> String
sq s@[c]                     = s
sq ('"':s)  | last s == '"'  = init s
            | otherwise      = s
sq ('\'':s) | last s == '\'' = init s
            | otherwise      = s
sq s                         = s

然后simple bs = read (sq.show bs) :: Int 按预期工作。

  1. 为什么会这样?
  2. 将 ByteString 转换为 Int 的最佳方法是什么?

【问题讨论】:

    标签: haskell bytestring


    【解决方案1】:

    ByteString 转换为X 的最佳方法是依赖X。如果您从String 进行了良好的转换,则通过Data.BytString.Char8.unpack 可能会很好,如果它是ASCII ByteString。对于 UTF-8 编码的ByteStrings,utf8-string 包包含转换函数toString。对于某些特定类型,如标题中提到的Int,存在特殊的更快转换。例如Data.ByteString.Char8.readIntreadInteger

    【讨论】:

    • 对于那些从互联网进来的人:如果“最佳方式”对您来说也意味着“有效方式”,这就是答案!
    【解决方案2】:

    Show 用于创建某事物的String 表示,这对于调试纯文本序列化 很有用。 Show 类型类不仅仅是将任何东西转换为String 的一种奇特方式。这就是ByteString 在字符串中添加引号的原因:因为在调试或反序列化数据流时可以说这样更容易阅读。

    您可以使用Data.ByteString.Char8.unpack 函数将ByteString 转换为String,但请注意,这会将ByteString 逐字节解包,这会混淆高值Unicode 字符或其他字符存储为多于一个字节;如果您想在结果上使用read 以外的其他操作,我建议您将ByteString 转换为Text,这样可以在这种情况下提供更大的灵活性。假设在这种情况下您的编码是 UTF8(在 Snap 中应该是默认编码),您可以为此使用 Data.Text.Encoding.decodeUtf8 函数。然后要将 Text 值转换为具有正确 Unicode 符号的 String,请使用 Data.Text.unpack

    一旦您拥有String,您就可以随意使用read;或者,您可以选择直接使用Data.Text.Read 模块中的函数读取Text 值。

    【讨论】:

    • 对我来说,问题 #2 仍然不是那么清楚——或者它可能只是我很好奇的一个更具体的用例,我认为这与这个最初的问题有关:如果有一些一种“长度字段”,被解析为长度为 4 的 ByteString,实际上描述了一个 Int32。您提出的解决方法仍然有效吗?作为一个更舒适的解决方案,我正在寻找一个可以采用这种 ByteString 并返回正确 Int 的库。有没有可以处理这个用例的库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2016-05-29
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多