1. ホーム
  2. java

[解決済み] Javaでバイト配列を初期化する方法を教えてください。

2022-03-13 17:37:59

質問

javaでいくつかの定数値(UUID)をバイト配列形式で保存しなければならないのですが、これらの静的配列を初期化する最良の方法は何でしょうか?これは私が現在行っている方法ですが、より良い方法があるはずだと感じています。

private static final byte[] CDRIVES = new byte[] { (byte)0xe0, 0x4f, (byte)0xd0,
    0x20, (byte)0xea, 0x3a, 0x69, 0x10, (byte)0xa2, (byte)0xd8, 0x08, 0x00, 0x2b,
    0x30, 0x30, (byte)0x9d };
private static final byte[] CMYDOCS = new byte[] { (byte)0xba, (byte)0x8a, 0x0d,
    0x45, 0x25, (byte)0xad, (byte)0xd0, 0x11, (byte)0x98, (byte)0xa8, 0x08, 0x00,
    0x36, 0x1b, 0x11, 0x03 };
private static final byte[] IEFRAME = new byte[] { (byte)0x80, 0x53, 0x1c,
    (byte)0x87, (byte)0xa0, 0x42, 0x69, 0x10, (byte)0xa2, (byte)0xea, 0x08,
    0x00, 0x2b, 0x30, 0x30, (byte)0x9d };
...
and so on

効率は悪くても、見た目がすっきりするようなものはないでしょうか? 例えば

private static final byte[] CDRIVES =
    new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };

解決方法は?

ユーティリティ関数を使って、おなじみのヘキサ文字列から byte[] . を定義するために使用すると final static 定数は、パフォーマンスコストとは無関係です。

Java 17以降

現在では java.util.HexFormat を行うことができます。

byte[] CDRIVES = HexFormat.of().parseHex("e04fd020ea3a6910a2d808002b30309d");

このユーティリティクラスは、フォーマットを指定することができます。他のフォーマットが読みやすいと感じる場合や、リファレンスソースからコピーペーストする場合に便利です。

byte[] CDRIVES = HexFormat.ofDelimiter(":")
    .parseHex("e0:4f:d0:20:ea:3a:69:10:a2:d8:08:00:2b:30:30:9d");

Java 17以前

でDave Lが定義した関数を使うことをお勧めします。 Javaを使って、16進ダンプの文字列表現をバイト配列に変換する?

byte[] CDRIVES = hexStringToByteArray("e04fd020ea3a6910a2d808002b30309d");

読みやすくするために、ここに挿入しています。

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}