9

浮動小数点値を持つ複雑なデータファイルを読み込もうとしています。この形式(Met Office PPファイル)を処理するいくつかのCコードが提供されており、ビットのいじりやスワッピングが多く行われます。そして、それは機能しません。データのサイズのようにかなり正しくなりますが、返される行列の数値は無意味であり、NaNと1e38や-1e38のような値が自由に散らばっています。

ただし、これらをnetCDFに変換できるバイナリexe( "convsh")があり、netCDFは見栄えがよくなります。風速の渦巻き模様のマ​​ップです。

私が考えているのは、PPファイルのバイトが間違った順序で読み込まれているということです。NetCDFデータで正しく返されたfloatのバイトと、Cコードから誤って返されたfloatのバイトを比較できれば、正しいスワップページを見つけることができます。

では、浮動小数点数の4(または8?)バイトをダンプする単純な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

バイトを再びdoubleに変換するには、代わりにBytesToDouble()を使用できます。

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

13.141593 _

リンク:

mcgaのCRANページ

于 2016-04-07T18:45:00.237 に答える