OpenTUT

データの切れ目がわからない?COBSを使え…

りn

データの切れ目がわからない?COBSを使え…


  • 1バイトごとにデータをするためのストリームがあるとする
  • しかしデータの切れ目がわからない…

俺が考えたアイデア

  • 8ビット区切りのデータを7ビットごとに区切り直して、先頭ビットに1を立てれば識別できるのでは?
  • 効率悪い
  • 1024バイト(8192ビット)送る場合、1024*8/7=1171バイト必要
  • 所詮素人の考えたアイデア…(泣)

COBSとは?

エンコード

  • 先に1パケットのサイズを決めておく(255バイトとすることが多いらしい、1バイトに収まるから)
  • 空の配列(バイト列)を用意し、先頭に長さを格納するための要素を一つ追加する
  • 255バイトに達するか、0が見つかるまで、配列に元データを追加しながら先頭要素をインクリメントし続ける
  • これを元データの終端まで繰り返す
  • 末尾に0を挿入する

デコード

  • エンコードされた配列の先頭バイトを見て、その長さ分読み出す
  • 長さが255未満であれば0を追加、そうでない場合はなにもしない
  • これをエンコードされた配列の終端まで繰り返す

注意点

  • エンコードされた配列の長さは多少増減するため、最悪の場合の長さを見積もっておく必要あり
  • 例: N+N/254=1029N + \lceil N / 254 \rceil = 1029

かしこい!