簡體   English   中英

ByteString表示Double轉換

[英]ByteString representation of a Double conversion

我正在編寫自己的使用ConduitWAVE解析器,因此我可以通過管道逐個傳輸值。

我通過hGet從.wav文件中獲取樣本(n是該wav文件的每個樣本的字節數):

bytes <- hGet hn

這給了我一個ByteString,表示樣本的Double值。 例如:

"\\131\\237\\242"代表-0.10212671756744385

"g\\238\\242"代表-0.10209953784942627

"\\215\\238\\242"代表-0.10208618640899658

可能的值介於-1和+1之間。

有沒有方便的方法來進行這種轉換? 有沒有圖書館可以做到這一點?

我已經看了Haskell的現有WAVE解析器。 Data.WAVE解析.wav文件並將樣本作為左對齊的Int32值返回。 我找到了一個解決方法,我使用它的庫函數將我的ByteString轉換為左對齊的Int32 ,然后使用庫的sampleToDouble函數將其轉換為Double 這有效,但我想知道是否有更直接的方法來解決這個問題。

另一種可能的解決辦法是將轉換ByteString[Word8]ByteString.unpack ,轉換[Word8]Word32 ,然后這個值轉換為Float使用從轉換函數Data.Binary.IEEE754 這會是一個很好的解決方案嗎? 一個問題是我目前不知道如何將[Word8]的四元素列表轉換為Word32。

這是我目前將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)

我想知道這是否可以以更有效的方式完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM