8
votes

Manipulation des données binaires signées dans HASKELLL SANS UNSEFECOERCE

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.binary fort>. Mon code actuel ressemble à:

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))


0 commentaires

3 Réponses :


3
votes

1 commentaires

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)



8
votes

detintegal convertira Word16 en int16. Cependant, vous devez vérifier que cela obtient le résultat que vous prévoyez d'anticiper la signature vis-à-vis.


2 commentaires

Ça va bien pour moi: detintegal (maxbound - 4 :: Word16) :: int16 .. > -5 .


Le document dit: "Detintegal convertit Word en octets par représentation, pas par la valeur"



1
votes

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 ou hôte-endian, mais ceux-ci peuvent être ajoutés: xxx


0 commentaires