[英]How do I initialize a byte array in Java?
我必須在 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" };
使用將 hexa 字符串轉換為byte[]
的函數,您可以
byte[] CDRIVES = hexStringToByteArray("e04fd020ea3a6910a2d808002b30309d");
我建議您使用 Dave L 在Convert a string representation of a hex dump to a byte array using Java? 中定義的函數?
我將它插入這里以獲得最大的可讀性:
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;
}
如果你讓 CDRIVES static
和final
,性能下降是無關緊要的。
byte[] myvar = "Any String you want".getBytes();
字符串文字可以轉義以提供任何字符:
byte[] CDRIVES = "\u00e0\u004f\u00d0\u0020\u00ea\u003a\u0069\u0010\u00a2\u00d8\u0008\u0000\u002b\u0030\u0030\u009d".getBytes();
在 Java 6 中,有一種方法完全符合您的要求:
private static final byte[] CDRIVES = javax.xml.bind.DatatypeConverter.parseHexBinary("e04fd020ea3a6910a2d808002b30309d")
或者你可以使用谷歌番石榴:
import com.google.common.io.BaseEncoding;
private static final byte[] CDRIVES = BaseEncoding.base16().lowerCase().decode("E04FD020ea3a6910a2d808002b30309d".toLowerCase());
當您使用小數組時,番石榴方法是矯枉過正的。 但是 Guava 也有可以解析輸入流的版本。 在處理大的十六進制輸入時,這是一個很好的功能。
您可以使用 Java UUID 類來存儲這些值,而不是字節數組:
UUID
public UUID(long mostSigBits,
long leastSigBits)
使用指定的數據構造一個新的 UUID。 mostSigBits 用於 UUID 的最高 64 位,而 leastSigBits 成為 UUID 的最低有效 64 位。
在編譯時可以通過十六進制數字分配的最小內部類型是char ,如
private static final char[] CDRIVES_char = new char[] {0xe0, 0xf4, ...};
為了擁有等效的字節數組,可以將轉換部署為
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;
}
一個沒有庫的解決方案,返回動態長度,無符號整數解釋(不是二進制補碼)
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 };
}
}
您可以使用此實用程序功能:
public static byte[] fromHexString(String src) {
byte[] biBytes = new BigInteger("10" + src.replaceAll("\\s", ""), 16).toByteArray();
return Arrays.copyOfRange(biBytes, 1, biBytes.length);
}
與 Denys Séguret 和 stefan.schwetschke 的變體不同,它允許在輸入字符串中插入分隔符(空格、制表符等),使其更具可讀性。
用法示例:
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");
就干凈的過程而言,您可以使用ByteArrayOutputStream對象...
ByteArrayOutputStream bObj = new ByteArrayOutputStream();
bObj.reset();
//將所有值一一寫入bObj使用
bObj.write(byte value)
// 完成后,您可以使用 byte[]
CDRIVES = bObj.toByteArray();
//您也可以對 CMYDOCS 和 IEFRAME 重復類似的過程,
注意如果您確實有小陣列,這不是一個有效的解決方案。
在這種情況下,我的首選選項是使用org.apache.commons.codec.binary.Hex
,它具有用於在String
y hex 和二進制之間轉換的有用 API。 例如:
Hex.decodeHex(char[] data)
如果數組中有非十六進制字符,或者有奇數個字符,則拋出DecoderException
。
Hex.encodeHex(byte[] data)
對應上面的decode方法,吐出char[]
。
Hex.encodeHexString(byte[] data)
將byte
數組轉換回String
。
用法: Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())
您可以使用充氣城堡包,
Maven 導入,
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
</dependency>
Java代碼,
byte[] CDRIVES = Hex.decode("e04fd020ea3a6910a2d808002b30309d");
private static final int[] CDRIVES = new int[] {0xe0, 0xf4, ...};
並在訪問后轉換為字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.