2012-01-14 16 views
1

を解凍がspectrum analyzerから受け取っ:?

#42404û¢ - +Ä¢-Va¢-oÆ¢-8æ¢-bE¢¢-OY - +Ä¢ - ?Ö¢-ÉÉ¢-ÜÖ¢-|¢ - =â-¢-8æ¢-uô¢ - =Æ¢ - \Å¢-uô¢ - ?ü¢ - } |¢ - =Æ ¢ - )...Perlのパックと機能

フォーマットは実数32で、各値を格納するために4バイトを使用します。番号42404は、4つの余分なバイトが存在し、2404/4 = 601が収集されたことを表す。 #42404の後にデータが開始されます。私は

$lp = ibqry($ud,":TRAC:DATA? TRACE1;*WAI;"); 

、文字列変数にこれを受信したときに今、私は数字の配列にこれを変換する方法を確認していない。(...私がfollowinのようなものを使用すべき

@dec = unpack("d", $lp); 

?私は正しい値を得ておらず、確実にデータポイントの数が601ではないので、これが機能しないことは分かっています...

+1

「実32」形式とは何ですか? – Schwern

+0

数値表現... – user2829

+0

実数32は、Fortran REAL * 4、32ビットの浮動小数点数、別名Cの浮動小数点数のように聞こえる。つまり、タイプとカウントの情報を含む文字列と、関連するバイト数のデータがあることを意味します。文字列内のデータがネイティブバイトオーダーで表示されるのか、それとも別の順序で表示されるのかを知っていますか?これは根本的に答えに影響します。 –

答えて

4

まず、#42404を取り除き、次のバイナリデータASCII番号でなければなりません。

$lp =~ s{^#\d+}{}; 

"Real 32"の形式はわかりませんが、32ビット長の単精度浮動小数点型だと推測します。 the pack docsを見てください。 dは「倍精度浮動小数点」です。これは64ビットです。だから私はf "単精度"を試してみたいと思います。

@dec = unpack("f*", $lp); 

データがbig or little endianであるかどうかは問題です。 dおよびfは、コンピュータのネイティブエンディアンを使用します。 ><修飾子を使用してエンディアンを強制する必要があります。

@dec = unpack("f*>", $lp); # big endian 
@dec = unpack("f*<", $lp); # little endian 
+0

私はこれをmy $ lp = pack( "f")のようなものにする必要があります。読み込むバイト数を正確に指定できますか? – user2829

+0

また、私は配列の中のただ1つの要素を得る:(-77。7630004882813 – user2829

+0

バイナリデータをPerlデータにアンパックします。フォーマットを繰り返す回数を指定できます。*はバイト数ではありません*。パックのドキュメントでは、「各文字に任意に繰り返し回数を示す数字が続く場合があります」を参照してください。あなたの例では 'unpack(" f [601] "、$ lp)'を使って$ lpから601浮動小数点数をアンパックします。 – Schwern

1

最初4は、このような何かがうまくいくかもしれない、山車の前に残りの桁数(2404)をコードする場合:

my @dec = unpack "x a/x f>*", $lp; 

xが有力#をスキップし、a/xは一桁を読み込みますそのあとに多くの文字をスキップし、f>*は32ビットビッグエンディアンのフロートのシーケンスとして残りの文字列を解析します。 (出力が奇妙に見える場合は、f<*を代わりに使用してください)

+0

私はそれを感謝します。何らかの理由で私はまだ62の値しか読まない。しかし、私は601ポイントを集めていると思います:( – user2829

+2

@ user2829: '$ lp'はどれくらいですか?2 + 4 + 2404 = 2410文字でないなら、 –

+0

@limari: - Perlを使用しているので、変数の長さを指定する必要はありませんか?そうすればどうですか? – user2829

関連する問題