在没有unsafeCoerce的情况下处理Haskell中的签名二进制数据

rpr*_*ero 8 binary haskell

我正在使用来自Data.BinaryGet 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.有没有更好的方法来处理这个?

ste*_*ley 8

fromIntegral将Word16转换为Int16.但是,您必须检查它是否获得了您预期的签名结果.

  • 该文档说:"fromIntegral通过表示将WOrd转换为字节类型,而不是通过值" (3认同)