Je lis dans une structure d'un fichier binaire contenant des entiers de 16 bits signés à l'aide de Obtenir forte> monade de 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))
3 Réponses :
Le problème est que cela échoue sur des nombres négatifs> (Convert (-1 :: Word16)) :: int16 *** Exception: Convertible: Erreur lors de la conversion des données de source 65535 de type Word16 en Tapez Int16: valeur d'entrée en dehors des limites: (- 32768.32767)
Ça va bien pour moi: detintegal (maxbound - 4 :: Word16) :: int16 code> ..
> -5 code>.
Le document dit: "Detintegal convertit Word en octets par représentation, pas par la valeur"
Bâtiment sur la réponse de Stephen Voici une implémentation des fonctions GET et Mettez des fonctions pour INT8, INT16 et INT32 analogues aux personnes existantes pour Word8, Word16 et Word32. Je n'ai pas encore requis int64 code> ou hôte-endian, mais ceux-ci peuvent être ajoutés: