我正在尝试读取具有浮点值的复杂数据文件.已经提供了一些处理这种格式(Met Office PP文件)的C代码,并且它做了很多小事和交换.它不起作用.它得到了很多权利,比如数据的大小,但返回矩阵中的数值是无意义的,有NaN和像1e38和-1e38这样的值被大量洒落.
但是,我有一个二进制exe("convsh")可以将这些转换为netCDF,并且netCDF看起来很好 - 风速很好的旋涡图.
我在想的是PP文件的字节是以错误的顺序读入的.如果我可以将netCDF数据中正确返回的浮点数的字节与从C代码错误地返回的浮点数中的字节进行比较,那么我可能会找出正确的swappage.
那么是否有一个普通的R函数来转储浮点数的四个(或八个?)字节?就像是:
> as.bytes(pi)
[1] 23 54 163 73 99 00 12 45 # made up values
Run Code Online (Sandbox Code Playgroud)
搜索"bytes"和"float"和"binary"没有帮助.
它在C中的微不足道,我可能已经把它写在我写这篇文章的时候......
rdyncall可能会给你你想要的东西:
library(rdyncall)
as.floatraw(pi)
# [1] db 0f 49 40
# attr(,"class")
# [1] "floatraw"
Run Code Online (Sandbox Code Playgroud)
或许writeBin(pi, raw(8))
?
是的,这必须存在于序列化代码中,因为R快乐地通过线路发送内容,同时处理字节序.您是否看过Rserve使用它,或者digest如何将char表示传递给选定的哈希函数?
快速浏览一下后digest.R
:
R> serialize(pi, connection=NULL, ascii=TRUE)
[1] 41 0a 32 0a 31 33 34 39 31 34 0a 31 33 31 38 34 30 0a
[19] 31 34 0a 31 0a 33 2e 31 34 31 35 39 32 36 35 33 35 38
[37] 39 37 39 33 0a
Run Code Online (Sandbox Code Playgroud)
和
R> serialize(pi, connection=NULL, ascii=FALSE)
[1] 58 0a 00 00 00 02 00 02 0f 02 00 02 03 00 00 00 00 0e
[19] 00 00 00 01 40 09 21 fb 54 44 2d 18
R>
Run Code Online (Sandbox Code Playgroud)
那可能会让你前进.
来考虑一下,这包括标题元数据.