From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

バイナリデータ

いつもお世話になっております。
 
測定器から出力されるデータをLabVIEWで読み込み、
データ解析することを考えております。
 
但し、測定器からの出力データがバイナリ形式のため、
LabVIEWで読み込んだ後、ASCII変換しようと考えておりますが、
バイナリデータを扱った経験のない私としましては、
どうしてよいのか分からず、途方に暮れている状況です。
 
バイナリファイルの形式(概略)は下記の通りです。
バイト数が一定であれば、LabVIEWでの読み込みは
なんとか実現できそうな気はしますが、バイト数がまちまちですので
どのように処理すべきなのか分かりません。

時間の猶予もありませんので、皆様のお力添えを頂きたいと願い、
ここに問合せする次第です。
 
オフセット:バイト数 :形式 : 項目
---------------------------------------------------------
     0               2        short    サンプリング間隔
     2               4        short    測定開始ポイント
     6               4        short    測定終了ポイント
   10               9        char     測定日
   19               2        float      データ数
   21               4        float      データ1
   25               4        float      データ2
   29               4        float      データ3
   33               4        float      データ4
    ・        
    ・
    ・
---------------------------------------------------------
宜しくお願い致します。
 
以上
メッセージ1/6
10,494件の閲覧回数
フォーマットに誤りがありました。
下記が正解です。
 
---------------------------------------------------------
     0               2        short    サンプリング間隔
     2               4        float    測定開始ポイント
     6               4        float    測定終了ポイント
    10               9        char     測定日
    19               2        short    データ数
    21               4        float    データ1
    25               4        float    データ2
    29               4        float    データ3
    33               4        float    データ4
    ・
    ・
    ・
---------------------------------------------------------
 
宜しくお願いします。
0 件の賞賛
メッセージ2/6
10,478件の閲覧回数

計測器からのデータがバイナリとのことですが、通常中身がバイナリ
であれ何であれ、読んだときはLabVIEWでは文字列で返ってくると
思いますので、それを所定のサイズの文字列に切り出して、それを
型変換してやれば良いかと推察されます。如何でしょうか。

なお、16bit整数、32bit整数は、計測器からのデータが
little endianかbig endianか(先頭バイトが整数の上位バイトか
下位バイトか)に応じて、swapをしてやる必要があります。

また、4バイトのfloatは、LabVIEWの "SGL" (IEEE32bit単精度実数形式?)
と同じ形式であれば、そのまま型変換してLabVIEWでも使えると
思いますが、形式が少し違っていたりすると、意味不明な数になって
しまうので注意が必要です(自分で仮数と指数から実数を再構成?)。
このまま使えると良いですが。。

なお、本サンプルは概要のみ示すための、あまり洗練されていない
姿ですので、ご了承下さい。また、念のため、型変換に上から接続
された "0" や "0.0" は、それぞれ "I16"(U16) や "SGL"
の表現で
なければなりません。

宜しくご参考下さい。
メッセージ3/6
10,478件の閲覧回数

アドバイスありがとうございます。早速参考にさせて頂きました。

なお、「計測器の出力データがバイナリ・・・」というのは私の記載誤りでして、

「計測器の出力データがバイナリで保存されている」が正解です。

さて、2バイトのshortはバイトスワップで読込むことができたのですが、

4バイトのfloatが変換できておりません。

以下のようにして変換を試みていますが、タイプキャストした時点で

数値が1以下であるため、I32変換でゼロに変換され、最終出力はゼロと

なってしまいます。

  4バイト読込⇒タイプキャスト⇒I32変換
              ⇒ワードスワップ⇒バイトスワップ⇒SGL変換

何か良い方法はございませんでしょうか?
 
コメントなどありましたら、宜しくお願い致します。
 
※白石様のおっしゃられる「サンプル」とは、サンプルプログラムを
  意味しているのでしょうか。何処を参照すれば良いのかお教えして頂きたく。
 
 
0 件の賞賛
メッセージ4/6
10,469件の閲覧回数

ぱな松 <x@no.email> wrote:
>4バイトのfloatが変換できておりません。
>以下のようにして変換を試みていますが、タイプキャストした時点で
>数値が1以下であるため、I32変換でゼロに変換され、最終出力はゼロと
>なってしまいます。
>  4バイト読込⇒タイプキャスト⇒I32変換
>⇒ワードスワップ⇒バイトスワップ⇒SGL変換

I32変換とか、SGL変換を使うと、「その数値と同じ数値を
表す数値」になるだけであって、型変換したことになりません。

もしかすると、下記の例の上の方に書いたような方法で、
一度SGLにタイプキャストしたものをI32変換していませんか?
もしそうであれば、これだと、まるめられてしまい、データを
損ねてしまいます。

単に、元のデータのバイト順序を変えたいのであれば、
元が文字列ですから、「文字列の順序を入れ替える」という
関数を使って反転させてから、SGLにタイプキャストしては
どうでしょうか?(下記の例の、下の方に書いたような方法で)

>※白石様のおっしゃられる「サンプル」とは、サンプルプログラムを
>  意味しているのでしょうか。何処を参照すれば良いのかお教えして頂きたく。

すみません、「サンプル」とは、「こういった例ではどうでしょう?」
という程度の意味のプログラム例のことで、どこかのサンプルプログラム
を意味しているわけではありません。ご参考程度に見ていただき、
実施されたい状況に合わせてmodifyして下さい、という意味でした。
(実際、VISA Readにも何のinputもつながっていませんから、
 そのままでは動きませんので・・)
メッセージ5/6
10,470件の閲覧回数
白石様
 
コメントありがとうございます。
その後の状況ですが、結論から申し上げますと
4バイトのfloat変換にも成功し、本件解決致しました。
 
白石様のおっしゃられる通り、一度SGLにタイプキャストしたものを
I32変換していました。
4バイト文字列をI32にタイプキャストし、
ワードスワップ、バイトスワップ、そしてSGLにタイプキャストすることで、
float変換することができました。
 
ご助言頂き、ありがとうございました。
また何かありましたら、ご相談させて頂きます。
その際には宜しくお願い致します。
 
0 件の賞賛
メッセージ6/6
10,455件の閲覧回数