【Java】0x00とStringの扱いを解説!初心者向けサンプル付きでわかりやすく解説

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

Javaで文字列を扱う際に「0x00」という表記を目にしたことはないでしょうか。
これは単なる数字ではなく、
文字列処理やバイナリデータの扱いで重要な意味を持つ特殊な値です。

経験の浅い方にとってはもしかしたら見慣れない記述かもしれませんが、
知っておくとデータ処理や文字列のトラブル解決に役立ちます。

この記事では、Javaにおける0x00とStringの関係を具体例を交えながら解説していきます。


0x00とは何か?Javaでの意味を整理

16進数表記としての0x00

Javaでは0xで始まる数値は16進数リテラルを表します。
0x00は10進数の 0 を意味します。

int num = 0x00;  // 10進数の0と同じ
System.out.println(num); // 出力: 0

つまり、数値としては普通の0と同じ扱いになります。

文字列やバイナリでの0x00

文字やバイナリの扱いでは、0x00は**ヌル文字(NULL文字)**を意味します。
これはASCIIコードで「文字が存在しない」ことを示す特殊な値です。

C言語では文字列の終端に使われますが、
JavaのStringでは終端文字としては使われません

そのため、Javaで0x00を文字列に含めると「空文字」ではなく
「見えない制御文字」として扱われます。


Javaで0x00をStringに含めるサンプル

実際にコードを実行して検証してみましょう。

基本的なサンプルコード

public class NullCharExample {
    public static void main(String[] args) {
        String text = "Hello" + '\u0000' + "World";
        System.out.println("長さ: " + text.length());
        System.out.println("内容: [" + text + "]");
    }
}

出力結果

長さ: 11
内容: [Hello World]

見た目には「Hello World」と表示されますが、
実際には「Hello」と「World」の間にヌル文字が入っています。

そのため、文字数(length)は11となり、
空白ではなく制御文字が存在しているのです。


実務での利用例:バイナリデータの処理

バイナリデータを扱う際、0x00はしばしば現れます。
例えば、外部システムから送られてきた固定長データに
「ヌル埋め」
がされている場合です。

実務的なコード例

import java.nio.charset.StandardCharsets;

public class BinaryDataExample {
    public static void main(String[] args) {
        byte[] data = { 'A', 'B', 'C', 0x00, 0x00 };
        String str = new String(data, StandardCharsets.UTF_8);
        System.out.println("受信文字列: [" + str + "]");
        System.out.println("長さ: " + str.length());
    }
}

出力結果

受信文字列: [ABC]
長さ: 5

このように、ヌル文字を含むデータを文字列化すると、
見た目と実際の長さが一致しないこと
があります。
ログやDB登録で不具合の原因になることもあります。


0x00を除去する方法

もし「0x00を文字列から取り除きたい」場合は、
以下のように正規表現を使うと便利です。

public class RemoveNullChar {
    public static void main(String[] args) {
        String original = "ABC\u0000\u0000XYZ";
        String cleaned = original.replaceAll("\u0000", "");
        System.out.println("変換前: [" + original + "]");
        System.out.println("長さ: " + original .length());
        System.out.println("変換後: [" + cleaned + "]");
        System.out.println("長さ: " + cleaned .length());
    }
}

出力結果

変換前: [ABC  XYZ]
長さ: 8
変換後: [ABCXYZ]
長さ: 6

このようにすれば、見えない制御文字を安全に取り除けます。


注意点:経験の浅い方が間違えやすいポイント

  1. 「0x00 = 空文字」ではない
    Javaの空文字は""ですが、0x00は「制御文字」です。誤解するとデータ処理でバグになります。
  2. Stringの終端には使われない
    C言語のように0x00で文字列が終了することはありません。そのため、Javaではlength()でカウントされます。
  3. 外部データ処理でのトラブル要因
    外部システムから受け取った文字列に0x00が混入していると、表示やDB保存時に予期せぬ問題が起こることがあります。

まとめ

  • 0x00は16進数表記の「0」であり、文字列では**ヌル文字(NULL文字)**を意味する。
  • JavaのStringではC言語のような終端文字ではなく、実際の文字としてカウントされる。
  • バイナリデータや外部システムとのやり取りで現れることがあり、
    不要な場合は除去処理が必要
  • 経験の浅い方は「0x00=空文字」と混同しやすいので要注意。

このように、Javaにおける「0x00とStringの関係」を正しく理解しておくことで、
実務でのデータ処理やデバッグに役立ちます。

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