我想在二进制数据上使用Data.Bits按位运算符。 我需要使用哪种数据类型? 我写了这个函数,例如:
ch :: Int8 -> Int8 -> Int8 -> Int8
ch x y z = (x .&. y) `xor` ((complement x) .|. z)
我想获取输入二进制类型或至少String
(不是Int
),但仍然使用Data.Bits
那么我需要改变才能像这样使用它? :
ch 11111111 101110011 10110101
答案 0 :(得分:4)
如上所述,ch
只会获取Int8
个值,但您可以放松函数的类型而不更改其实现:
import Data.Bits
ch :: Bits a => a -> a -> a -> a
ch x y z = (x .&. y) `xor` (complement x .|. z)
二进制值只是整数的特定表示,但为了使事情更具可读性,您可以启用BinaryLiterals
,例如像这样在GHCi:
*Q48065001> :set -XBinaryLiterals
*Q48065001> ch 0b11111111 0b101110011 0b10110101
-58
在代码文件中,您可以使用语言编译指示启用它:
{-# LANGUAGE BinaryLiterals #-}
如果你有二进制数的字符串表示,你首先需要解析它们。参见例如Convert a string representing a binary number to a base 10 string haskell
答案 1 :(得分:0)
二进制数据I / O的一个很好的选择是Data.ByteString.Lazy
,这是一个高度优化的库,用于读取Date
值。它包括let decoder = JSONDecoder()
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "MM-dd-yyyy"
decoder.dateDecodingStrategy = .formatted(formatter)
let result = try decoder.decode(Person.self, from: data)
和Word8
中大多数列表和I / O函数的模拟,非常适合高效的交互式I / O,因为它读取字节并可以将其写为懒惰评估的严格数组列表。它还具有有效的功能,可以转换为各种编码。另请参阅this tutorial。