Shift_JIS -> JIS

Javaのアプリケーションで、UNICODEを介さずにShift_JISのDBCSをJISに変換したいとする。ただし、JISで必要なSHIFT-IN/SHIFT-OUTは変換後に付加するので、変換時には敢えて付加しないこととする。
バイナリとエンコードされた文字列から使えるように、引数をbyte配列とし、以下のメソッドを組んだ。

public static final byte[] sjis2JisDBCS(byte[] src) {
    if ( (src.length % 2) != 0 ) return src;//要素数が奇数の場合は変換できない
    int i = 0;
    byte[] result = new byte[src.length];
    while ( i < src.length ) {
        int leader  = src[i];
        int trailer = src[i+1];
        leader -= ( leader <= 0x9F ) ? 0x71 : 0xB1;
        leader = (byte)(leader << 1);
        leader ++;
        if(trailer > 0x7F) {
            trailer --;
        }
        if(trailer >= 0x9E){
            trailer -= 0x5e;
            leader ++;
        }
        trailer -= 0x1F;
        result[i] = (byte)leader;
        result[i+1] = (byte)trailer;
        i+=2;
    }
    return result;
}

これ以上に効率の良い、短いロジックも書けるのだろうが、私にはこれが限界。
これで処理は完璧と思ったのだが、句点が滅茶苦茶のようで"東京特許許可局"を変換すると、"桃供督距距嘉曲"などとなる。(こういうバグって、コンピュータに阿呆な指示をしたのが目に見えて解るので、とても面白い)

さて、何が悪かったのだろうか?