我正在使用来自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))
Run Code Online (Sandbox Code Playgroud)
我对使用unsafeCoerce不满意,但似乎没有办法直接读入Int16,也没有办法将Word16转换为Int16.有没有更好的方法来处理这个?
fromIntegral将Word16转换为Int16.但是,您必须检查它是否获得了您预期的签名结果.