質問: ### 前提・実現したいこと シリアル通信でデータを出力している機器がありこれからデータを拾いたいです。 下記簡略化した仕様の例ですがSTXとETXで開始と終了が区切られています。 {STX} {4バイト整数} {ETX} データサイズは固定長ですが連続してデータを垂れ流している状態です。 ### 発生している問題 4バイト整数の中にETX(0x03)やSTX(0x02)が含まれる場合があり、単純にSTX,ETXで区切るとデータを正しく拾うことができない時があります。 ### 質問 ・受信側のプログラムで対処する方法 ・機器側のデータ出力の仕様は妥当なのか ・データ出力の仕様が不適切な場合、バイナリ形式でデータを出力する際はどのような仕様が望ましいのか
回答: (書いてるうちに解決済になってしまった...) > > 機器側のデータ出力の仕様は妥当なのか > > > (仕様の簡略化されたところに何かあったりせず、スタート部分が不明で読むことは想定された使い方だとして) 「ほとんどのデータで問題なく動く」でよければ妥当です。 「あらゆるデータで問題なく動く」を求めるなら妥当でないです。 > > 受信側のプログラムで対処する方法 > > > 4バイトでないものは弾いて、偶然ETX/STXの間が4バイトのものは不正な値が読めるのは稀なこととして許容するしかないです。 実用上、最初の1回以外で問題が起こることはまずないでしょう。 > > データ出力の仕様が不適切な場合、バイナリ形式でデータを出力する際はどのような仕様が望ましいのか > > > 確実に問題が起こらないようにするなら、データ内に区切り文字を含まないようにデータをエンコードするしかないですね。 1つは区切り文字だけを別の文字に置き換える方法。仕組みが単純ですが、内容によってデータ長が変わること、特に区切り文字のみが連続した場合に大幅に増えるのが欠点です。 もう1つ、全体をbase64などで変換し区切り文字を含まないデータにする方法もあります。内容によらずデータ長が一定ですが、目視でデータが読めない欠点があります。 問題が稀にしか起こらなければよいのであれば、チェックサムを付けるのもよいでしょう。区切り文字を長くする方法も思いつきます。