Haskell 双转换的ByteString表示法

Haskell 双转换的ByteString表示法,haskell,wav,data-conversion,bytestring,Haskell,Wav,Data Conversion,Bytestring,我正在编写自己的WAVE解析器,使用它可以通过管道一个接一个地传输值 我通过hGet从.wav文件中获取一个样本(n是该wav文件的每个样本的字节数): bytes这是我当前将ByteString转换为双精度的解决方案: convertNBytesLen :: [Word8] -> Int32 convertNBytesLen = foldr accum 0 where accum bs a = 256 * a + fromIntegral bs bsToDouble :: S.B

我正在编写自己的
WAVE
解析器,使用它可以通过管道一个接一个地传输值

我通过
hGet
从.wav文件中获取一个样本(n是该wav文件的每个样本的字节数):


bytes这是我当前将ByteString转换为双精度的解决方案:

convertNBytesLen :: [Word8] -> Int32
convertNBytesLen = foldr accum 0
  where accum bs a = 256 * a + fromIntegral bs


bsToDouble :: S.ByteString -> Int -> Double
bsToDouble bs n = if intV >= 0
                   then fromIntegral intV / 2147483647
                   else - (fromIntegral intV / (-2147483648))
  where intV = convertNBytesLen (S.unpack bs) `shift` (32 - 8 * n)

我想知道这是否能以更有效的方式完成

这是我当前将ByteString转换为double的解决方案:

convertNBytesLen :: [Word8] -> Int32
convertNBytesLen = foldr accum 0
  where accum bs a = 256 * a + fromIntegral bs


bsToDouble :: S.ByteString -> Int -> Double
bsToDouble bs n = if intV >= 0
                   then fromIntegral intV / 2147483647
                   else - (fromIntegral intV / (-2147483648))
  where intV = convertNBytesLen (S.unpack bs) `shift` (32 - 8 * n)

我想知道这是否能以更有效的方式完成

您看过
bytestring lexing
库中的
readDouble
了吗?我觉得这些不像十六进制字符。@liminalish我看过。但我似乎无法安装该软件包。看起来像是被咬了。@ThomasM.DuBuisson你说得对。事实上,我不太确定代表性是什么。我来换个问题。你看过
bytestring lexing
库中的
readDouble
了吗?我看那些不像十六进制字符。@liminalish我没有。但我似乎无法安装该软件包。看起来像是被咬了。@ThomasM.DuBuisson你说得对。事实上,我不太确定代表性是什么。我来换个问题。