我可以创建FILE实例(FILE*) by byte[ ]
数据(在内存中)吗?不要写文件。
(C,Linux)
我需要offical MiniSEED Library解析'MiniSEED'格式数据。
这些库支持解析“MiniSEED”格式数据包以文件形式写入的数据。
但我需要直接解析Byte[]
数组中的'MiniSEED'数据。不要创建真实的文件。
(因为我必须通过实时TCP数据包连续获取'MiniSEED'数据
并且这些库仅支持通过书面文件解析数据的方式。)
所以我尝试直接解决由FILE
数据创建byte[]
实例的问题。
我认为这种解决方案是最好的方法而不用改变库是一种简单的方法。
答案 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系统下,根据数据的大小,实际上可能不需要将文件写入磁盘。它可以驻留在内核的缓存结构中以便更快地访问(默认情况下会发生这种情况:您无需额外执行任何操作)。