我可以获得R float的字节表示吗?

时间:2013-01-16 14:54:30

标签: r floating-point

我正在尝试读取具有浮点值的复杂数据文件。已经提供了一些处理这种格式(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

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

它在C中的微不足道,我可能已经把它写在我写这篇文章的时候......

3 个答案:

答案 0 :(得分:8)

rdyncall 可能会为您提供所需内容:

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

或者writeBin(pi, raw(8))

答案 1 :(得分:6)

是的,必须存在于序列化代码中,因为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

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> 

这可能会让你前进。

考虑一下,这包括标题元数据。

答案 2 :(得分:0)

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

> DoubleToBytes(pi)

1 24 45 68 84 251 33 9 64

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

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

1 3.141593

链接:

CRAN page of mcga