9

我正在尝试读取具有浮点值的复杂数据文件。已经提供了一些处理这种格式(Met Office PP 文件)的 C 代码,并且它做了很多位旋转和交换。它不起作用。它非常正确,就像数据的大小一样,但是返回矩阵中的数值是荒谬的,有 NaN 和 1e38 和 -1e38 等值自由散布。

但是,我有一个二进制 exe(“convsh”)可以将这些转换为 netCDF,并且 netCDF 看起来不错 - 漂亮的旋涡风速图。

我在想的是 PP 文件的字节被以错误的顺序读取。如果我可以将 netCDF 数据中正确返回的浮点数的字节与从 C 代码错误返回的浮点数中的字节进行比较,那么我可能会找出正确的交换页。

那么是否有一个普通的 R 函数来转储浮点数的四个(或八个?)字节?就像是:

> as.bytes(pi)
[1] 23 54 163 73 99 00 12 45 # made up values

搜索“bytes”、“float”和“binary”没有帮助。

它在 C 中是微不足道的,我可能在我写这个的时候就写了它......

4

3 回答 3

9

rdyncall可能会给你你正在寻找的东西:

library(rdyncall)
as.floatraw(pi)
# [1] db 0f 49 40
# attr(,"class")
# [1] "floatraw"

或者也许writeBin(pi, raw(8))

于 2013-01-16T15:01:02.237 回答
6

是的,这必须存在于序列化代码中,因为 R 很乐意通过网络发送内容,同时也考虑字节序。您是否看过例如 Rserve 使用它,或者摘要如何将 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

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> 

这可能会让你继续前进。

想一想,这包括标题元数据。

于 2013-01-16T14:57:31.973 回答
0

mcga包(机器编码遗传算法)包括一些用于字节到双精度和双精度到字节转换的函数。为了处理 pi 的字节,您可以使用 DoubleToBytes,例如:

> DoubleToBytes(pi)

1 24 45 68 84 251 33 9 64

为了再次将字节转换为双精度,可以使用 BytesToDouble() 代替:

> BytesToDouble(c(24,45,68,84,251,33,9,64))

1 3.141593

链接:

mcga 的 CRAN 页面

于 2016-04-07T18:45:00.237 回答