有馬です。

String にメソッドを追加して、100kbytes ぐらいのバイナリデータを
抱えて処理したのですが、ruby 1.4.4 (2000-04-14) [i686-linux] だと
うまく動きませんでした。
前後を比較すると正規表現の処理で見落としがあるようです。
\020\003 が \003 に置き換わることを期待しているのですが、
\020\020\020\003 以外でも残っていました。

class String
  DLE = 020
  CAN = 003
  PLUSCHR = '+'

  def decode_1()
    st = self.dup
    st.gsub!( /(#{DLE.chr})(#{PLUSCHR})/o ) { $2 }
    st.gsub!( /(#{DLE.chr})(#{CAN.chr})/o ) { $2 }
    st.gsub!( /(#{DLE.chr})(#{DLE.chr})/o ) { $2 }
    st
  end
end

以下のように書くと期待どおりに動作します。

  def decode_2()
    st = self.dup
    st.gsub!( /\020\+/o )   { '+' }
    st.gsub!( /\020\003/o ) { "\003" }
    st.gsub!( /\020\020/o ) { "\020" }
    st
  end

ruby 1.5.4 (2000-06-05) [i686-linux] でも期待通り動作しました。

--
 有馬 康弘 <fit0298 / fitec.co.jp>