我正在使用 Data.Binary 中的 Get monad 从包含有符号 16 位整数的二进制文件中读取结构。我当前的代码如下所示:
data DetectorStats = DetectorStats Int16 Word8 Word8
Word8 Int16 Version Int16
deriving Show
getDetectorStats :: Get DetectorStats
getDetectorStats = do
productNumber <- getWord16be
bitPerCoordinate <- getWord8
energyCapability <- getWord8
timingCapability <- getWord8
clockFrequency <- getWord16be
serialNumber <- getWord16be
return (DetectorStats (unsafeCoerce productNumber )
bitPerCoordinate
energyCapability
timingCapability
(unsafeCoerce clockFrequency)
firmwareVersion
(unsafeCoerce serialNumber))
我对使用 unsafeCoerce 不满意,但似乎没有办法直接读取 Int16 ,也没有办法转换 < strong>Word16 转换为 Int16。有没有更好的方法来处理这个问题?
最佳答案
fromIntegral 会将 Word16 转换为 Int16。但是,您必须检查它是否获得了您预期的签名结果。
关于haskell - 在 Haskell 中处理签名的二进制数据而不使用 unsafeCoerce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160644/