estoy leyendo en una estructura de un archivo binario que contiene números enteros de 16 bits firmados utilizando el Obtener mónada de Data.Binary. Mi código actual se parece a:Manipulación de datos binario con signo en Haskell sin unsafeCoerce
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))
No estoy feliz por el uso de unsafeCoerce, pero no parece ser una manera de leer en un Int16 directamente, ni una forma de convertir el Word16 en un Int16. ¿Hay una mejor manera de manejar esto?
Me parece bien: 'fromIntegral (maxBound - 4 :: Word16) :: Int16' .. '> -5'. – sclv
El documento dice: "fromIntegral convierte tipos WOARD a Byte por representación, no por valor" – fuz