Saya harus menyimpan beberapa nilai konstan (UUID) dalam bentuk array byte di java, dan saya bertanya-tanya apa cara terbaik untuk menginisialisasi array statis tersebut. Beginilah cara saya saat ini melakukannya, tetapi saya merasa pasti ada cara yang lebih baik.
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
Adakah yang bisa saya gunakan yang mungkin kurang efisien, tetapi akan terlihat lebih bersih? sebagai contoh:
private static final byte[] CDRIVES =
new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };
"0000"
menjadi{0x30,0x30,0x30,0x30}
(ASCII) daripada{0x00,0x00,0x00,0x00}
(biner) seperti yang diinginkan oleh poster?Di Java 6, ada metode yang melakukan apa yang Anda inginkan:
private static final byte[] CDRIVES = javax.xml.bind.DatatypeConverter.parseHexBinary("e04fd020ea3a6910a2d808002b30309d")
Atau Anda bisa menggunakan Google Guava :
import com.google.common.io.BaseEncoding; private static final byte[] CDRIVES = BaseEncoding.base16().lowerCase().decode("E04FD020ea3a6910a2d808002b30309d".toLowerCase());
Metode Guava berlebihan, jika Anda menggunakan array kecil. Tetapi Guava juga memiliki versi yang dapat mengurai aliran input. Ini adalah fitur yang bagus saat berhadapan dengan input heksadesimal yang besar.
sumber
base16().lowerCase().decode(...)
jika Anda memiliki digit hex huruf kecil. docs.guava-libraries.googlecode.com/git/javadoc/com/google/…javax.xml.bind
sayangnya dihapus di Jawa 9.Anda dapat menggunakan kelas UUID Java untuk menyimpan nilai-nilai ini, sebagai ganti array byte:
UUID public UUID(long mostSigBits, long leastSigBits)
Membuat UUID baru menggunakan data yang ditentukan. mostSigBits digunakan untuk 64 bit UUID yang paling signifikan dan leastSigBits menjadi 64 bit UUID yang paling signifikan.
sumber
Solusi tanpa pustaka, panjang dinamis dikembalikan, interpretasi integer tak bertanda tangan (bukan pelengkap dua)
public static byte[] numToBytes(int num){ if(num == 0){ return new byte[]{}; }else if(num < 256){ return new byte[]{ (byte)(num) }; }else if(num < 65536){ return new byte[]{ (byte)(num >>> 8),(byte)num }; }else if(num < 16777216){ return new byte[]{ (byte)(num >>> 16),(byte)(num >>> 8),(byte)num }; }else{ // up to 2,147,483,647 return new byte[]{ (byte)(num >>> 24),(byte)(num >>> 16),(byte)(num >>> 8),(byte)num }; } }
sumber
Sejauh menyangkut proses bersih, Anda dapat menggunakan objek ByteArrayOutputStream ...
ByteArrayOutputStream bObj = new ByteArrayOutputStream(); bObj.reset();
// tulis semua nilai ke bObj satu per satu menggunakan
bObj.write(byte value)
// setelah selesai Anda bisa mendapatkan byte [] menggunakan
// daripada Anda dapat mengulangi proses serupa untuk CMYDOCS dan IEFRAME juga,
CATATAN Ini bukan solusi yang efisien jika Anda benar-benar memiliki larik kecil.
sumber
Tipe internal terkecil, yang pada waktu kompilasi dapat ditentukan oleh bilangan hex adalah char , as
private static final char[] CDRIVES_char = new char[] {0xe0, 0xf4, ...};
Untuk memiliki array byte yang setara, seseorang dapat menerapkan konversi sebagai
public static byte[] charToByteArray(char[] x) { final byte[] res = new byte[x.length]; for (int i = 0; i < x.length; i++) { res[i] = (byte) x[i]; } return res; } public static byte[][] charToByteArray(char[][] x) { final byte[][] res = new byte[x.length][]; for (int i = 0; i < x.length; i++) { res[i] = charToByteArray(x[i]); } return res; }
sumber
Pilihan saya yang lebih disukai dalam keadaan ini adalah menggunakan
org.apache.commons.codec.binary.Hex
yang memiliki API yang berguna untuk mengubah antaraString
y hex dan biner. Sebagai contoh:Hex.decodeHex(char[] data)
yang melemparDecoderException
jika ada karakter non-hex dalam larik, atau jika ada jumlah karakter ganjil.Hex.encodeHex(byte[] data)
adalah pasangan dari metode decode di atas, dan mengeluarkan filechar[]
.Hex.encodeHexString(byte[] data)
yang mengubah kembali daribyte
array menjadi aString
.Pemakaian:
Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())
sumber
Anda dapat menggunakan fungsi utilitas ini:
public static byte[] fromHexString(String src) { byte[] biBytes = new BigInteger("10" + src.replaceAll("\\s", ""), 16).toByteArray(); return Arrays.copyOfRange(biBytes, 1, biBytes.length); }
Tidak seperti varian Denys Séguret dan stefan.schwetschke, ini memungkinkan penyisipan simbol pemisah (spasi, tab, dll.) Ke dalam string input, membuatnya lebih mudah dibaca.
Contoh penggunaan:
private static final byte[] CDRIVES = fromHexString("e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b 30 30 9d"); private static final byte[] CMYDOCS = fromHexString("BA8A0D4525ADD01198A80800361B1103"); private static final byte[] IEFRAME = fromHexString("80531c87 a0426910 a2ea0800 2b30309d");
sumber
private static final int[] CDRIVES = new int[] {0xe0, 0xf4, ...};
dan setelah akses dikonversi ke byte.
sumber