【Java】0xffをbyteに変換する方法まとめ|初心者向けサンプル付き解説

お疲れ様です。はるさらと申します。

Javaを扱っていると「0xff」をbyteに変換したい場面に出くわすこともあります。
特にバイナリデータ処理や通信関連のプログラムでは、
16進数リテラルを扱うことが多いため、
正しい変換方法を理解しておくことは重要です。

本記事では、Javaにおける0xffをbyteへ変換する方法を、
初心者向けサンプル付きでわかりやすく解説します。

関連記事: Javaでの「0x」の意味を解説 ― 初心者向けサンプル付き
関連記事: 【Java】0x00とStringの扱いを解説!初心者向けサンプル付きでわかりやすく解説


0xffとは何かを整理する

まず「0xff」とは何を意味しているのでしょうか。

  • 0x は16進数を表すプレフィックス
  • ff は16進数で「255」に相当
  • つまり 0xff = 255 (10進数)

ただし、Javaのbyte型は -128 ~ 127 の範囲しか表現できません。
そのため、255を直接byteに収めると符号付きの負の値に変換されます。


基本例:0xffをbyteにキャストする

最もシンプルな方法はキャストです。

public class ConvertFFToByte {
    public static void main(String[] args) {
        int value = 0xff; // 255
        byte b = (byte) value;
        System.out.println(b); // -1 と出力される
    }
}

結果は -1 になります。
これはbyteの範囲に収めるためにオーバーフローが発生し、
2の補数表現として-1になる
ためです。


実務利用例:バイト配列に格納する場合

通信データやファイル処理では、byte[]に格納するケースが一般的です。

public class ByteArrayExample {
    public static void main(String[] args) {
        byte[] buffer = new byte[2];
        buffer[0] = (byte) 0xff; // -1
        buffer[1] = (byte) 0x7f; // 127

        for (byte b : buffer) {
            System.out.println(b);
        }
    }
}

出力は次のようになります。

-1
127

ここで0xff-1として格納されますが、
バイナリデータとしては正しく「0xff」の1バイトが保存されています。


代替手法の比較:符号なし表現を扱う場合

Javaには符号なしbyte型が存在しないため、
0xffを符号なしの255として扱いたい場合は工夫が必要です。

1. intで受けてマスク処理

public class UnsignedExample {
    public static void main(String[] args) {
        byte b = (byte) 0xff;
        int unsignedValue = b & 0xff; // マスク処理で255を得る
        System.out.println(unsignedValue); // 255
    }
}

2. Byte.toUnsignedInt() を使う

Java 8以降であれば、標準メソッドが利用できます。

public class UnsignedExample2 {
    public static void main(String[] args) {
        byte b = (byte) 0xff;
        int unsignedValue = Byte.toUnsignedInt(b);
        System.out.println(unsignedValue); // 255
    }
}

これにより、直感的に「符号なし変換」ができるようになります。


注意点と間違えやすいポイント

  • (byte) 0xffは255ではなく-1になる
    Javaのbyteは符号付き型なので注意。
  • 符号なし表現が欲しいときはintで扱う
    b & 0xffByte.toUnsignedInt()を利用。
  • 表示と内部データを混同しない
    出力では-1でも、内部的には「0xff」というビット列が保持されている。

関連記事リンク


まとめ

  • 0xff は16進数で255を表す
  • byteにキャストすると -1 になる(符号付き表現のため)
  • 実務では byte[] で扱うことが多い
  • 符号なしの255として使いたい場合は b & 0xffByte.toUnsignedInt() を使う

Javaでの16進数やbyte変換を正しく理解しておくことで、
バイナリ処理や通信プログラムを安全に実装できます。

どなたかのお役に立てば幸いです。
それではまたー!