我可以通过byte []数据创建FILE实例吗? (不要写文件)

时间:2014-01-10 09:06:26

标签: c linux

我可以创建FILE实例(FILE*) by byte[ ]数据(在内存中)吗?不要写文件。 (C,Linux)

我需要offical MiniSEED Library解析'MiniSEED'格式数据。

这些库支持解析“MiniSEED”格式数据包以文件形式写入的数据。

但我需要直接解析Byte[]数组中的'MiniSEED'数据。不要创建真实的文件。 (因为我必须通过实时TCP数据包连续获取'MiniSEED'数据 并且这些库仅支持通过书面文件解析数据的方式。)

所以我尝试直接解决由FILE数据创建byte[]实例的问题。

我认为这种解决方案是最好的方法而不用改变库是一种简单的方法。

3 个答案:

答案 0 :(得分:2)

可以从Linux中的内存数据创建FILE句柄,因为Linux C库支持fmemopen()中的POSIX.1-2008

调用fmemopen(buffer, size, "r")会在FILE处为包含size字节的内存中对象生成只读buffer句柄。

但是,我不明白为什么你需要这样的东西。

The official Mini-SEED library确实提供了函数msr_unpack()(和msr_unpack_data())来解析Mini-SEED数据记录。

您可能正在使用的功能ms_readmsr()ms_readtraces()(或其线程安全变体ms_readmsr_r()ms_readtraces_r(),只需从文件中读取每条记录,将每个传递给msr_unpack()(如果是跟踪,则移至mst_addmsrtogroup()mstl_addmsr())。

换句话说,该库确实支持解析内存中的数据。你断言它只支持解析文件显然不正确。

网上似乎没有提供描述库函数的手册页,但如果您下载libmseed sources,则可以使用man -l libmseed/doc/[function].3阅读库函数手册页。

答案 1 :(得分:0)

不,没有可移植的标准方法来创建表示内存中字节流的FILE *

典型的解决方案是改为使读取和写入功能可以挂钩,以便代替硬编码,例如read()使库调用(可选)应用程序提供的函数。

答案 2 :(得分:0)

作为折衷方案,您可以使用mmap在内存和文件之间创建直接映射。这将允许您直接更新内容(通过访问内存),库可以通过文件界面访问相同的数据。在Unix系统下,根据数据的大小,实际上可能不需要将文件写入磁盘。它可以驻留在内核的缓存结构中以便更快地访问(默认情况下会发生这种情况:您无需额外执行任何操作)。