続) Shift_JIS -> JIS

問題はここだった。

 int leader  = src[i];
 int trailer = src[i+1];

引数のバイト配列の上位バイトと下位バイトを、それぞれの計算のためにリーダとトレーラに格納している。ここでbyte->intの変換が行われるのだが、Javaのbyte型は1バイトで符号有りの型なので補数の値がそのままint型に変換されてしまう。意図通りに正しくintに変換したいのであれば、下位ビットだけを有効にする必要があるので、例えば、以下のように書く必要がある。

 int leader  = src[i] & 0xFF;
 int trailer = src[i+1] & 0xFF;

Javaの型にいわゆる「unsigned」は無い。普段は全く気にならないのだが、今回のようにレガシーなシステムのコードをベースにしたり、情報のやりとりが発生する際には必ず型、それも比較的小さいプリミティブな型の互換性が問題になってしまうので、せめて、Cでいう所の「unsigned char」位は欲しかったな、と思うことがある。