質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

998閲覧

バイナリーファイル解析 日時情報の変換

angew

総合スコア20

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/03/14 06:17

編集2022/03/14 12:39

とある測定機器が出力するファイル(バイナリー形式)から取り出したい日時データがあります。
Stirlingというソフトを使って、ファイルを比較しながら、必要なデータの格納場所は判明しました。
データは
"4A 9D B2 5B"で、2021/05/07 05:59:22,971です。
"0A 4D 14 3F"で、2021/04/19 08:49:15,020です。

structライブラリを用いて変換するコードを書きたいのですが、そもそもどういったルールでデータが変換されているのかわかりません。
何かわかりそうであればご教示頂きたく宜しくお願いします。

他データの参考例
2022/01/24 07:21:00,870 ⇒ 4C E0 53 01
2022/01/24 07:37:08,310 ⇒ 4C E0 53 22
2022/01/24 08:05:16,079 ⇒ 4C 60 54 40
2022/01/24 08:29:01,881 ⇒ 4C 60 D4 05

データの格納場所について範囲の拡大が必要であることがわかりましたので訂正致します。申し訳ありません。
2022/01/24 07:21:00,870 ⇒ 4C E0 53 01 00 00 00 00 60 00 00 00 10 27
2022/01/24 07:37:08,310 ⇒ 4C E0 53 22 00 00 00 00 01 00 00 00 10 27
2022/01/24 08:05:16,079 ⇒ 4C 60 54 40 00 00 00 00 01 00 00 00 10 27
2022/01/24 08:29:01,881 ⇒ 4C 60 D4 05 00 00 00 00 68 01 00 00 10 27
2021/05/07 05:59:22,971 ⇒ 4A 9D B2 5B 00 00 00 00 08 07 00 00 D0 07
2021/04/19 08:49:15,020 ⇒ 0A 4D 14 3F 00 00 00 00 08 07 00 00 D0 07

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
CSVデータ①
取り込みモード,ノーマル
収集開始日時,2021/04/19 08:49:15,020
サンプリング周期,2s
AD積分時間,2ms(500Hz)
データ数,1800
データ圧縮処理,標準

CH設定
チャンネル,,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16
チャンネル名,,Channel1,温度5ch,温度6ch,温度7ch,Channel5,圧力5ch,圧力6ch,圧力7ch,Modbus1,Modbus2,Modbus3,Modbus4,Modbus5,Modbus6,Modbus7,Modbus8,Modbus9,Modbus10,Modbus11,Modbus12,Modbus13,Modbus14,Modbus15,Modbus16
入力レンジ,,K熱電対,K熱電対,K熱電対,K熱電対,±1V,±1V,±1V,±1V,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16
小数点以下の桁数,,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
単位,,℃,℃,℃,℃,kPa,kPa,kPa,kPa,,,,,,,,,,,,,,,,
測定処理,,OFF,OFF,OFF,OFF,スケーリング,スケーリング,スケーリング,スケーリング,,,,,,,,,,,,,,,,
計測値1,,,,,,1.00000,1.00000,1.00000,1.00000,,,,,,,,,,,,,,,,
計測値2,,,,,,-1.00000,-1.00000,-1.00000,-1.00000,,,,,,,,,,,,,,,,
表示値1,,,,,,101.300,101.300,101.300,101.300,,,,,,,,,,,,,,,,
表示値2,,,,,,-101.300,-101.300,-101.300,-101.300,,,,,,,,,,,,,,,,
アラーム1,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,
アラーム2,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,
アラーム3,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,
アラーム4,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,

#EndHeader,ms,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16
2021/04/22 17:49:15,380,BURNOUT,19.95,20.00,19.90,27.0,-0.8,-4.9,-2.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2021/04/22 17:49:17,380,BURNOUT,19.95,20.00,19.85,29.2,-0.8,-4.9,-2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2021/04/22 17:49:19,380,BURNOUT,19.90,19.95,19.85,29.8,-0.8,-4.9,-2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
CSVデータ②
取り込みモード,ノーマル
収集開始日時,2021/05/07 05:59:22,971
サンプリング周期,2s
AD積分時間,2ms(500Hz)
データ数,1800
データ圧縮処理,標準

CH設定
チャンネル,,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16
チャンネル名,,Channel1,温度5ch,温度6ch,温度7ch,Channel5,圧力5ch,圧力6ch,圧力7ch,Modbus1,Modbus2,Modbus3,Modbus4,Modbus5,Modbus6,Modbus7,Modbus8,Modbus9,Modbus10,Modbus11,Modbus12,Modbus13,Modbus14,Modbus15,Modbus16
入力レンジ,,K熱電対,K熱電対,K熱電対,K熱電対,±1V,±1V,±1V,±1V,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16
小数点以下の桁数,,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
単位,,℃,℃,℃,℃,kPa,kPa,kPa,kPa,,,,,,,,,,,,,,,,
測定処理,,OFF,OFF,OFF,OFF,スケーリング,スケーリング,スケーリング,スケーリング,,,,,,,,,,,,,,,,
計測値1,,,,,,1.00000,1.00000,1.00000,1.00000,,,,,,,,,,,,,,,,
計測値2,,,,,,-1.00000,-1.00000,-1.00000,-1.00000,,,,,,,,,,,,,,,,
表示値1,,,,,,101.300,101.300,101.300,101.300,,,,,,,,,,,,,,,,
表示値2,,,,,,-101.300,-101.300,-101.300,-101.300,,,,,,,,,,,,,,,,
アラーム1,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,
アラーム2,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,
アラーム3,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,
アラーム4,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF
値A,,,,,,,,,,,,,,,,,,,,,,,,,
値B,,,,,,,,,,,,,,,,,,,,,,,,,
オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,,
アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,,

#EndHeader,ms,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16
2021/05/07 09:59:23,329,BURNOUT,212.85,22.75,22.20,34.5,2.7,0.3,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2021/05/07 09:59:25,329,BURNOUT,212.85,22.75,22.20,37.4,2.7,0.4,0.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2021/05/07 09:59:27,329,BURNOUT,212.85,22.75,22.20,40.2,2.7,0.4,0.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

データの格納場所について
本データの構成は測定機器情報(ヘッダー部分)+測定結果(数値テーブル部分)で構成されており、今回知りたい日時の情報は測定機器情報に含まれる『収集開始日時』です。
比較しているデータは測定機器情報が収集開始日時を除いてすべて同じで、Stirlingで比較した際に上述している4Byteのみ異なるため、格納場所が間違っていなことに自信があります。
※測定結果はデータが異なるのでバイナリーデータも違いますが、こちらの数値デーブルはすべて抽出できているので、間違いなく収集開始日時のデータは含まれていません。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これまでに行ったこと
UNIX時刻で格納されているケースを想定して
ビッグエンディアンorリトルエンディアンで指数値(INT)に変換して、UNIX時刻があっているかどうか。
他の書式指定文字で同様に何パターンか試してみましたが、マッチする組み合わせがありませんでした。

yyyymmddHHMMSSsssの形(10進数)が16進数で格納されているケースを想定して
16進数を10進数に変換した数値が合っているか確認しました。
yymmddHHMMSSの形式などのいくつかのパターンを同様に試してみましたがマッチする組み合わせがありませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/03/14 06:52

まずはどういうルールで変換されてるのかってのを特定しましょうよ。 他人に作業丸投げされても困りますよ
angew

2022/03/14 07:16

UNIX時刻で格納されているケースを想定して 4A 9D B2 5Bを ビッグエンディアンで指数値(INT)に変換して、UNIX時刻にすると2005年03月14日 リトルエンディアンで指数値(INT)に変換して、UNIX時刻にすると1995年10月09日 と違うようです。 他の書式指定文字で同様に何パターンか試してみましたが、マッチする組み合わせがありませんでした。 yyyymmddHHMMSSsssの形で16進数で格納されているケースを想定して、 2021/05/07 05:59:22,971を変換すると47 CD 59 5D CC 7F 1Bと違うようです。 yymmddHHMMSSの形式などのいくつかのパターンを同様に試してみましたがマッチする組み合わせがありませんでした。 他にどのようなルールが適用されている可能性があるのかアイディア頂ければ嬉しいです。 ルールの特定ができず困っていて、申し訳ないです。
y_waiwai

2022/03/14 07:29

1日変えてどういうデータになるか、 同様に1時間変えて、1分変えて、1秒変えて、というふうにデータを蓄積していっては。 2つの例だけだしてどうにかせいというのはあまりに乱暴ですぜ
angew

2022/03/14 08:23

機器の使用上、ぴったり1時間ずらすとかいうのは難しいのですが、データの蓄積を行って解析をしています。 2022/01/24 07:21:00,870 ⇒ 4C E0 53 01 2022/01/24 07:37:08,310 ⇒ 4C E0 53 22 2022/01/24 08:05:16,079 ⇒ 4C 60 54 40 2022/01/24 08:29:01,881 ⇒ 4C 60 D4 05 先述のような解析をこれらのデータを対象に行っていますが、自分にはいまだにルールの特定に至っていません。アイディアございましたら教えて頂きたくお願いします。
takasima20

2022/03/14 08:35

たまたまかもしれませんが、ASCII文字表現できる率が高い気がします。 格納場所の再検証をオススメするかなあ。
angew

2022/03/14 10:31 編集

Stirlingというソフト上で解析をしており、このソフト中にASCⅡで表示することができますが、どうやら違うようです。 格納場所についてですが、 本データの構成は測定機器情報(ヘッダー部分)+測定結果(数値テーブル部分)で構成されており、今回知りたい日時の情報は測定機器情報に含まれる『収集開始日時』です。 比較しているデータは測定機器情報が収集開始日時を除いてすべて同じで、Stirlingで比較した際に上述していえる4Byteのみ異なるため、格納場所が間違っていなことに自信があります。 ※測定結果はデータが異なるのでバイナリーデータも違いますが、こちらの数値デーブルはすべて抽出できているので、間違いなく収集開始日時のデータは含まれていません。 当該機器のメーカーがデータの変換に関して一般的ではないルールで行っている(めちゃくちゃ複雑にはしていないとは思いますが・・・)と想像しています。 経験上、バイナリーファイルの解析は地道に解析するしかないですが、アイディア次第では一瞬で道が開けるものと思っています。アイディアだけでもいいのでお力添え頂ければと思い、書き込ませて頂いている次第です。 何卒よろしくお願い致します。
angew

2022/03/14 10:28 編集

参考までにCSV変換したデータを書き込みしておきます。 取り込みモード,ノーマル 収集開始日時,2021/04/19 08:49:15,020 サンプリング周期,2s AD積分時間,2ms(500Hz) データ数,1800 データ圧縮処理,標準 CH設定 チャンネル,,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16 チャンネル名,,Channel1,温度5ch,温度6ch,温度7ch,Channel5,圧力5ch,圧力6ch,圧力7ch,Modbus1,Modbus2,Modbus3,Modbus4,Modbus5,Modbus6,Modbus7,Modbus8,Modbus9,Modbus10,Modbus11,Modbus12,Modbus13,Modbus14,Modbus15,Modbus16 入力レンジ,,K熱電対,K熱電対,K熱電対,K熱電対,±1V,±1V,±1V,±1V,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16 小数点以下の桁数,,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 単位,,℃,℃,℃,℃,kPa,kPa,kPa,kPa,,,,,,,,,,,,,,,, 測定処理,,OFF,OFF,OFF,OFF,スケーリング,スケーリング,スケーリング,スケーリング,***,***,***,***,***,***,***,***,***,***,***,***,***,***,***,*** 計測値1,,,,,,1.00000,1.00000,1.00000,1.00000,,,,,,,,,,,,,,,, 計測値2,,,,,,-1.00000,-1.00000,-1.00000,-1.00000,,,,,,,,,,,,,,,, 表示値1,,,,,,101.300,101.300,101.300,101.300,,,,,,,,,,,,,,,, 表示値2,,,,,,-101.300,-101.300,-101.300,-101.300,,,,,,,,,,,,,,,, アラーム1,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, アラーム2,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, アラーム3,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, アラーム4,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, #EndHeader,ms,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16 2021/04/22 17:49:15,380,BURNOUT,19.95,20.00,19.90,27.0,-0.8,-4.9,-2.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2021/04/22 17:49:17,380,BURNOUT,19.95,20.00,19.85,29.2,-0.8,-4.9,-2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2021/04/22 17:49:19,380,BURNOUT,19.90,19.95,19.85,29.8,-0.8,-4.9,-2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
angew

2022/03/14 10:28 編集

別のファイル 取り込みモード,ノーマル 収集開始日時,2021/05/07 05:59:22,971 サンプリング周期,2s AD積分時間,2ms(500Hz) データ数,1800 データ圧縮処理,標準 CH設定 チャンネル,,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16 チャンネル名,,Channel1,温度5ch,温度6ch,温度7ch,Channel5,圧力5ch,圧力6ch,圧力7ch,Modbus1,Modbus2,Modbus3,Modbus4,Modbus5,Modbus6,Modbus7,Modbus8,Modbus9,Modbus10,Modbus11,Modbus12,Modbus13,Modbus14,Modbus15,Modbus16 入力レンジ,,K熱電対,K熱電対,K熱電対,K熱電対,±1V,±1V,±1V,±1V,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16 小数点以下の桁数,,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 単位,,℃,℃,℃,℃,kPa,kPa,kPa,kPa,,,,,,,,,,,,,,,, 測定処理,,OFF,OFF,OFF,OFF,スケーリング,スケーリング,スケーリング,スケーリング,***,***,***,***,***,***,***,***,***,***,***,***,***,***,***,*** 計測値1,,,,,,1.00000,1.00000,1.00000,1.00000,,,,,,,,,,,,,,,, 計測値2,,,,,,-1.00000,-1.00000,-1.00000,-1.00000,,,,,,,,,,,,,,,, 表示値1,,,,,,101.300,101.300,101.300,101.300,,,,,,,,,,,,,,,, 表示値2,,,,,,-101.300,-101.300,-101.300,-101.300,,,,,,,,,,,,,,,, アラーム1,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, アラーム2,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, アラーム3,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, アラーム4,,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF,OFF 値A,,,,,,,,,,,,,,,,,,,,,,,,, 値B,,,,,,,,,,,,,,,,,,,,,,,,, オンディレイ時間(s),,,,,,,,,,,,,,,,,,,,,,,,, アラーム出力先,,,,,,,,,,,,,,,,,,,,,,,,, #EndHeader,ms,1)TH_CH1,1)TH_CH2,1)TH_CH3,1)TH_CH4,1)TH_CH5,1)TH_CH6,1)TH_CH7,1)TH_CH8,MB_CH1,MB_CH2,MB_CH3,MB_CH4,MB_CH5,MB_CH6,MB_CH7,MB_CH8,MB_CH9,MB_CH10,MB_CH11,MB_CH12,MB_CH13,MB_CH14,MB_CH15,MB_CH16 2021/05/07 09:59:23,329,BURNOUT,212.85,22.75,22.20,34.5,2.7,0.3,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2021/05/07 09:59:25,329,BURNOUT,212.85,22.75,22.20,37.4,2.7,0.4,0.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2021/05/07 09:59:27,329,BURNOUT,212.85,22.75,22.20,40.2,2.7,0.4,0.4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
guest

回答1

0

ベストアンサー

時・分・秒について

とりあえず、当初の質問文に与えられた6つの4バイトのデータで検証しただけですが、
時・分・秒は、下記のような規則が成り立っているようです。

1.質問文の6つの例について、左側に元データの16進数を2進数化したもの、右側に時刻表現を並べました。
なお、2行目、3行目は説明のための4bit区切りの桁数を表しています。

text

1<-------- BINARY ---------> |<-------- DATETIME STRING---------> 2a b c d e f g h | 31234 1234 1234 1234 1234 1234 1234 1234 | 4----------------------------------------|---------------------------------- 50100 1010 1001 1101 1011 0010 0101 1011 | 2021/05/07 05:59:22,971 60000 1010 0100 1101 0001 0100 0011 1111 | 2021/04/19 08:49:15,020 70100 1100 1110 0000 0101 0011 0000 0001 | 2022/01/24 07:21:00,870 80100 1100 1110 0000 0101 0011 0010 0010 | 2022/01/24 07:37:08,310 90100 1100 0110 0000 0101 0100 0100 0000 | 2022/01/24 08:05:16,079 100100 1100 0110 0000 1101 0100 0000 0101 | 2022/01/24 08:29:01,881 11

2.ここで、Nibble(4bitの塊)「c」をNibble「f」の後ろ側に移動させます

text

1cをfの後ろに持っていった後: 2<-------- BINARY ---------> |<-------- DATETIME STRING---------> 3a b d e f [c] g h | 41234 1234 1234 1234 1234 1234 1234 1234 | 5----------------------------------------|---------------------------------- 60100 1010 1101 1011 0010 1001 0101 1011 | 2021/05/07 05:59:22,971 70000 1010 1101 0001 0100 0100 0011 1111 | 2021/04/19 08:49:15,020 80100 1100 0000 0101 0011 1110 0000 0001 | 2022/01/24 07:21:00,870 90100 1100 0000 0101 0011 1110 0010 0010 | 2022/01/24 07:37:08,310 100100 1100 0000 0101 0100 0110 0100 0000 | 2022/01/24 08:05:16,079 110100 1100 0000 1101 0100 0110 0000 0101 | 2022/01/24 08:29:01,881 12

3.このようにしたとき、

時 = f(4bit)+cの上位1bit 
分 = hの下位2bit+e(4bit)
秒 = g(4bit)+hの上位2bit

となっているようです。

Hour、minute、secondを表す桁を区切ってみました。 <-------- BINARY ---------> |<-------- DATETIME STRING---------> a b d e f [c] g h |         mmmm2HHHH H-??? ssss ss:mm1 0100 1010 1101 1011 0010 1-001 0101 10:11 | 2021/05/07 05:59:22,971 0000 1010 1101 0001 0100 0-100 0011 11:11 | 2021/04/19 08:49:15,020 0100 1100 0000 0101 0011 1-110 0000 00:01 | 2022/01/24 07:21:00,870 0100 1100 0000 0101 0011 1-110 0010 00:10 | 2022/01/24 07:37:08,310 0100 1100 0000 0101 0100 0-110 0100 00:00 | 2022/01/24 08:05:16,079 0100 1100 0000 1101 0100 0-110 0000 01:01 | 2022/01/24 08:29:01,881

時・分・秒を並べかえて表示

text

1HHHHH:mmmmmm:ssssss 200101:111011:010110 ===> 05:59:22 301000:110001:001111 ===> 08:49:15 400111:010101:000000 ===> 07:21:00 500111:100101:001000 ===> 07:37:08 601000:000101:010000 ===> 08:05:16 701000:011101:000001 ===> 08:29:01

年月日について

時・分・秒は上の考え方でOKとみなして、時分秒に該当する部分をマスクしたデータを眺めてみましょう。

<-------- BINARY ---------> |<-------- DATETIME STRING---------> a b d e f [c] g h | 0100 1010 1101 ---- ---- -001 ---- ---- | 2021/05/07 0000 1010 1101 ---- ---- -100 ---- ---- | 2021/04/19 0100 1100 0000 ---- ---- -110 ---- ---- | 2022/01/24 0100 1100 0000 ---- ---- -110 ---- ---- | 2022/01/24 0100 1100 0000 ---- ---- -110 ---- ---- | 2022/01/24 0100 1100 0000 ---- ---- -110 ---- ---- | 2022/01/24

下の4つはバイナリ・日付文字列共に共通なので、上の3つだけから考えるしかなさそうです。

ここで、2021と2022の差 「1」に相当する部分が作れないか探してみます。
すると、bの上位3bitで説明できそうですね。
仮に、「bの上位3bitに2016を足したものが年になる」と仮定して残りの桁を見ていきましょう。

<-------- BINARY ---------> |<-------- DATETIME STRING---------> a b d e f [c] g h | yyy 0100 1010 1101 ---- ---- -001 ---- ---- | 2021/05/07 0000 1010 1101 ---- ---- -100 ---- ---- | 2021/04/19 0100 1100 0000 ---- ---- -110 ---- ---- | 2022/01/24

試行錯誤して、残りの部分で月/日を6つの例と整合するような組み合わせを探すと、下記のようになりました。
・月 => dの下位2bit+aの上位2bit
・日 => cの下位3bit+dの上位2bit

<-------- BINARY ---------> |<-------- DATETIME STRING---------> a b d e f [c] g h | 1234 1234 1234 1234 1234 1234 1234 1234 | MM2 yyy MM1 DD2 DDD1 0100 1010 1101 ---- ---- -001 ---- ---- | 2021/05/07 0000 1010 1101 ---- ---- -100 ---- ---- | 2021/04/19 0100 1100 0000 ---- ---- -110 ---- ---- | 2022/01/24

年月日を並び替えて表示

yyy/MMMM/DDDDD 101/0101/00111 ===> 5/05/07  101/0100/10011 ===> 5/04/19 110/0001/11000 ===> 6/01/24 ※年は2016を足す。

まとめ

ターゲットとなる4バイトを2進数化して先頭から4bitずつ区切ったものを「a, b, c, d, e, f, g, h」とおいたとき:
・年 = b の上位3bit(*)に、2016(10進数)を足した数 (*「aの下位2bit+bの上位3bit」である可能性が高い)
・月 = d の下位2bit + a の上位2bit
・日 = c の下位3bit + d の上位2bit
・時 = f (4bit)+ c の上位1bit 
・分 = h の下位2bit + e (4bit)
・秒 = g (4bit) + h の上位2bit

※上記において、「+」記号は、前に記述した2進数に、後ろに記述した2進数を連結することを表す。

(ミリ秒の格納方法は不明です。コメントの追加データから規則性は見つけられませんでした)


解析手順の途中で、cをfの後ろに持って行っただけの状態で進めたので、不可解な格納方法に思われましたが
それぞれのbit列が連続するように整理すると、
下記のように、g h -> e f -> c d -> a b の順(バイト列で見るとリトルエンディアン)になっていますね。

g h e f c d a b ssss ssmm mmmm HHHH HDDD DDMM MM?? yyy?

投稿2022/03/14 12:00

編集2022/03/14 14:39
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

angew

2022/03/14 12:44

qnoir様 ご回答ありがとうございます。 回答拝見しまして、こういう格納の仕方があるのかと勉強させて頂いてます。 まだ理解が追い付いていないところもあり、しっかりと見させて頂きます。 年月とミリ秒について、引き続き調査して頂いているということ大変ありがたく思います。 一方、改めてデータを比較したところ、格納場所の範囲を拡大するべきと考えました。大変申し訳ないです。 2022/01/24 07:21:00,870 ⇒ 4C E0 53 01 00 00 00 00 60 00 00 00 10 27 2022/01/24 07:37:08,310 ⇒ 4C E0 53 22 00 00 00 00 01 00 00 00 10 27 2022/01/24 08:05:16,079 ⇒ 4C 60 54 40 00 00 00 00 01 00 00 00 10 27 2022/01/24 08:29:01,881 ⇒ 4C 60 D4 05 00 00 00 00 68 01 00 00 10 27 2021/05/07 05:59:22,971 ⇒ 4A 9D B2 5B 00 00 00 00 08 07 00 00 D0 07 2021/04/19 08:49:15,020 ⇒ 0A 4D 14 3F 00 00 00 00 08 07 00 00 D0 07 このデータで引き続き調査して頂けたら大変ありがたいです。自分でも考えてみます。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2022/03/14 13:02

今のところ検証できるデータがたった6つしかないので、誤りがあるかもしれません。特に年が2パターン、月のパターン・日のパターンが3つしかないので、年月日について他のパターンがあるとよいかもしれません。
退会済みユーザー

退会済みユーザー

2022/03/14 13:43

年月日については、当初の4バイトだけで説明がつきましたが、ミリ秒については、追記データからも規則性は見つけられませんでした。おそらくバイナリにミリ秒のデータは含まれていないか、別の場所に格納されているものと思います。
angew

2022/03/14 14:15

検討して頂きありがとうございました。 時分秒については、教えて頂いたルールに基づいてスクリプトを書いて、他ファイルでも正しく変換できることを確認できました。 こういった規則で格納されているケースがあることを知ることができ勉強になりました。 同様にすれば年月日ミリ秒もデータが得られると思われますので、自分で引き続き検証していきたいと思います。 ご指摘の通り、年月日のパターンが少ないので確証に至らなかったかもしれません。申し訳ありません。 年については2021年からとなっており、2パターンしかありませんが、月日は何パターンが用意できましたので、掲載しておきます。 ミリ秒に関しては他の格納場所を探してみます。 ここまでご協力頂いたことに感謝してベストアンサーをつけさせて頂きます。 2021/05/10 05:59:57,119 ⇒ 4A A9 B2 E7 00 00 00 00 08 07 00 00 D0 07 2021/06/16 08:46:48,780 ⇒ 8A 41 E4 C2 00 00 00 00 08 07 00 00 D0 07 2021/12/10 06:58:48,090 ⇒ 0A 2B A3 C3 00 00 00 00 63 00 00 00 10 27 2021/12/13 07:56:13,500 ⇒ 0A B7 83 37 00 00 00 00 68 01 00 00 10 27 2022/01/24 07:21:00,870 ⇒ 4C E0 53 01 00 00 00 00 60 00 00 00 10 27 2022/01/24 07:37:08,310 ⇒ 4C E0 53 22 00 00 00 00 01 00 00 00 10 27 2022/01/24 08:05:16,079 ⇒ 4C 60 54 40 00 00 00 00 01 00 00 00 10 27 2022/01/24 08:29:01,881 ⇒ 4C 60 D4 05 00 00 00 00 68 01 00 00 10 27 2022/02/15 09:03:24,971 ⇒ 8C BC 34 60 00 00 00 00 68 01 00 00 10 27 2022/02/28 21:58:07,720 ⇒ 8C F0 AA 1F 00 00 00 00 D7 00 00 00 10 27 2022/03/01 06:28:33,400 ⇒ CC 04 C3 85 00 00 00 00 68 01 00 00 10 27 2022/03/11 06:04:00,790 ⇒ CC 2C 43 00 00 00 00 00 01 01 00 00 10 27 2022/03/14 06:03:21,289 ⇒ CC 38 33 54 00 00 00 00 68 01 00 00 10 27
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問