質問: CharCode.UTF_8 ){ switch( bdata ){ case "EFBC90": return '0'; case "EFBC91": return '1'; } throw new IllegalArgumentException(); } } ``` 上のソースのコンストラクタでバイトを指定して、バイトに{ 0xEF, 0xBC, 0x92 }のデータ、UTF-8というデータを与えました。そしたら、 1 を入力した、というデータは取得できたのですが、コンストラクタで呼び出している`setByte`で正しいバイトが入っていないようでした。 その当時は-の値だったので、ネットで調べ、整数値を出すことに成功しました。 しかし、現在出力されている値は 1 つめが 17 です。ただ、0xEFは 10 進数に直すと 239 なので、正しい値が入っていないようです。 // binarydata の文字列を 16 進数に変換のところでエラーが起きていると思われるのですが... どうしたらいいでしょうか。 ``` package org.jyl.base.io; /** * 文字コードを定義した列挙型です。 * * @author とあるゆっくり */ public enum CharCode { /** * {@code ASCII} を示します。 * 最大バイト数は 1 バイトです。 */ ASCII, /** * {@code EUC-jp} を示します。 * 半角カタカナの対応予定は現在ありません。 * 最大バイト数は制御文字も合わせ 3 バイトです。 */ EUC, /** * {@code Shift-JIS} を示します。 * 最大バイト数は 2 バイトです。 */ Shift_JIS, /** * {@code Unicode}( UTF-16 ) を示します。 * {@code UTF-8} は {@code UTF_8} を参照してください。 * 最大バイト数は 4 バイトです。 */ Unicode, /** * {@code UTF-8} を示します。 * 技術的制限により、_を使用しています。 * 最大バイト数は 6 バイトです。 */ UTF_8, }; ```
回答: 0xEF は int として見ると 239 かもしれませんが, (signed) byte としてみると -16 です. (byte)( ~bycp + 1 ); の結果は 17 ですので, 「現在出力されている値は 1 つめが 17 」というのはコードの動きとしては合っていると思います. この変換を外しては如何でしょうか. つまり「その当時は-の値だった」のが正しく, 「整数値を出すことに成功」したのは byte が signed(値範囲:-128~127) ではなく unsigned (値範囲:0~255) と思われていた勘違いからのコードの破壊だったと思います.