gpt4 book ai didi

c - 用 Haskell 写入二进制数据以供 C 读取?

转载 作者:太空狗 更新时间:2023-10-29 16:53:49 29 4
gpt4 key购买 nike

我有一个包含 [Double] 的文件,该文件由 Data.Binary 序列化,我想用 C 读取它。也就是说,我想编写一个 C 程序将该数据读入内存作为 double[]。我打算编写一个 Haskell 程序来反序列化数据文件,然后将二进制数据写入一个新的、更简单的文件中,我可以直接将其读入 C,但我不确定如何只写出原始二进制数据(例如, double 8 个字节)。

最佳答案

您可以将 Data.Binary 重新用于 data-binary-ieee754 的目的包,它允许将 FloatDouble 序列化为它们的 IEEE 表示。例如:

import Data.List
import Data.Binary.Put
import Data.Binary.IEEE754
import Control.Monad

putRawDoubles :: [Double] -> Put
putRawDoubles xs = do
putWord64le $ genericLength xs
mapM_ putFloat64le xs

如果 data-binary-ieee754 中的 Double 有一个类似 putWord64host 的东西就好了,但既然没有,我就用了一点-字节序。如果您希望在不显式处理 C 程序中的转换的情况下跨字节序进行移植,您可以尝试 putWord64host 。 doubleToWord(doubleToWord 也来自 Data.Binary.IEEE754)。尽管我认为整数字节序在某些平台上与浮点字节序不同......

顺便说一句,我建议即使对于您的常规序列化也使用这样的格式; IEEE float 是通用的,二进制的默认浮点格式很浪费(正如 Daniel Fischer 指出的那样)。

您可能还想考虑 cereal序列化库,比二进制更快,维护更好(二进制自 2009 年以来未更新)并且支持 IEEE 浮点格式 built-in .

关于c - 用 Haskell 写入二进制数据以供 C 读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8965968/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com