diff --git a/gnss-converters.cabal b/gnss-converters.cabal
--- a/gnss-converters.cabal
+++ b/gnss-converters.cabal
@@ -1,6 +1,6 @@
 cabal-version: >=1.22
 name: gnss-converters
-version: 0.3.35
+version: 0.3.36
 license: BSD3
 copyright: Copyright (C) 2016, 2017 Swift Navigation, Inc.
 maintainer: Swift Navigation <dev@swiftnav.com>
diff --git a/src/Data/RTCM3/SBP/MSM.hs b/src/Data/RTCM3/SBP/MSM.hs
--- a/src/Data/RTCM3/SBP/MSM.hs
+++ b/src/Data/RTCM3/SBP/MSM.hs
@@ -33,10 +33,10 @@
 toSender station = station .|. 61440
 
 masks :: Bits a => Int -> a -> [b] -> [b]
-masks n a bs = fst <$> filter snd (zip bs $ testBit a <$> [n,n-1..0])
+masks n a bs = fst <$> filter snd (zip bs $ testBit a <$> [n-1,n-2..0])
 
 mask :: FiniteBits a => a -> [Word8]
-mask n = masks (finiteBitSize n-1) n [(1::Word8)..]
+mask n = masks (finiteBitSize n) n [1..]
 
 toCells :: MsmHeader -> [((Int, Word8), (Int, Word8))]
 toCells hdr =
@@ -159,7 +159,7 @@
     { _packedObsContent_P     = toP (roughPseudorange + finePseudorange)
     , _packedObsContent_L     = toL ((roughPseudorange + finePhaserange) * (freq / 299792458.0))
     , _packedObsContent_D     = toD
-    , _packedObsContent_cn0   = (sigData ^. msm4SignalData_cnrs) !! sigIndex
+    , _packedObsContent_cn0   = ((sigData ^. msm4SignalData_cnrs) !! sigIndex) * 4
     , _packedObsContent_lock  = (sigData ^. msm4SignalData_lockTimes) !! sigIndex
     , _packedObsContent_sid   = sid
     , _packedObsContent_flags = pseudorangeValid .|. phaseValid .|. halfCycleResolved
@@ -167,9 +167,9 @@
   where
     pseudorangeValid  = 1
     phaseValid        = 2
-    halfCycleResolved = bool 0 4 $ (sigData ^. msm4SignalData_halfCycles) !! sigIndex
+    halfCycleResolved = bool 4 0 $ (sigData ^. msm4SignalData_halfCycles) !! sigIndex
     roughPseudorange  = fromIntegral ((satData ^. msm46SatelliteData_ranges) !! satIndex) * gpsPseudorange +
-                        fromIntegral ((satData ^. msm46SatelliteData_rangesModulo) !! satIndex) / (1024 * gpsPseudorange)
+                        fromIntegral ((satData ^. msm46SatelliteData_rangesModulo) !! satIndex) * gpsPseudorange / 1024
     finePseudorange   = fromIntegral ((sigData ^. msm4SignalData_pseudoranges) !! sigIndex) * gpsPseudorange * (2 ** (-24))
     finePhaserange    = fromIntegral ((sigData ^. msm4SignalData_phaseranges) !! sigIndex) * gpsPseudorange * (2 ** (-29))
 
@@ -181,7 +181,7 @@
     { _packedObsContent_P     = toP (roughPseudorange + finePseudorange)
     , _packedObsContent_L     = toL ((roughPseudorange + finePhaserange) * (freq / 299792458.0))
     , _packedObsContent_D     = toD
-    , _packedObsContent_cn0   = round (fromIntegral ((sigData ^. msm7SignalData_cnrs) !! sigIndex) * ((2 :: Double) ** (-4)))
+    , _packedObsContent_cn0   = round (fromIntegral ((sigData ^. msm7SignalData_cnrs) !! sigIndex) * ((2 :: Double) ** (-4)) * 4)
     , _packedObsContent_lock  = toLock $ lock ((sigData ^. msm7SignalData_lockTimes) !! sigIndex)
     , _packedObsContent_sid   = sid
     , _packedObsContent_flags = pseudorangeValid .|. phaseValid .|. halfCycleResolved
@@ -189,9 +189,9 @@
   where
     pseudorangeValid  = 1
     phaseValid        = 2
-    halfCycleResolved = bool 0 4 $ (sigData ^. msm7SignalData_halfCycles) !! sigIndex
+    halfCycleResolved = bool 4 0 $ (sigData ^. msm7SignalData_halfCycles) !! sigIndex
     roughPseudorange  = fromIntegral ((satData ^. msm57SatelliteData_ranges) !! satIndex) * gpsPseudorange +
-                        fromIntegral ((satData ^. msm57SatelliteData_rangesModulo) !! satIndex) / (1024 * gpsPseudorange)
+                        fromIntegral ((satData ^. msm57SatelliteData_rangesModulo) !! satIndex) * gpsPseudorange / 1024
     finePseudorange   = fromIntegral ((sigData ^. msm7SignalData_pseudoranges) !! sigIndex) * gpsPseudorange * (2 ** (-29))
     finePhaserange    = fromIntegral ((sigData ^. msm7SignalData_phaseranges) !! sigIndex) * gpsPseudorange * (2 ** (-31))
 
