2012-06-26 51 views
93

我必須以字節數組形式存儲一些常量值(UUID)在Java中,我想知道什麼是初始化這些靜態數組的最佳方式。這就是我目前正在做的事情,但我覺得必須有更好的方式。如何在Java中初始化一個字節數組?

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" }; 

回答

87

使用功能的六字符串轉換爲byte[],你可以做

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

我建議你使用由Dave 1所定義的函數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 staticfinal,業績下滑是伊雷爾埃文特。

6

您可以使用Java UUID類來存儲,而不是字節數組這些值:

UUID 

public UUID(long mostSigBits, 
      long leastSigBits) 

構造使用指定的數據的新的UUID。 mostSigBits用於UUID的最高有效64位,leastSigBits成爲UUID的最低有效64位。

1

至於清潔過程而言,你可以使用ByteArrayOutputStream對象...

ByteArrayOutputStream bObj = new ByteArrayOutputStream(); 
bObj.reset(); 

//通過一個用寫的所有值BOBJ一個

bObj.write(byte value) 

//當完成後,你可以得到字節[]使用

CDRIVES = bObj.toByteArray(); 

//比你可以重複CMYDOCS和IEFRAME類似的過程,

注意這是不是一個有效的解決方案,如果你真的有小陣。

27

在Java 6中,恰好有這樣一個方法,你想要什麼:

private static final byte[] CDRIVES = javax.xml.bind.DatatypeConverter.parseHexBinary("e04fd020ea3a6910a2d808002b30309d") 

另外,您可以使用Google Guava

import com.google.common.io.BaseEncoding; 
private static final byte[] CDRIVES = BaseEncoding.base16().lowerCase().decode("E04FD020ea3a6910a2d808002b30309d".toLowerCase()); 

番石榴方法是矯枉過正,當您使用小數組。但番石榴也有可以解析輸入流的版本。處理大的十六進制輸入時,這是一個很好的功能。

+0

番石榴例如做書面不大的工作 - 它必須是'base16()小寫(。 ).decode(...)'如果你有小寫十六進制數字。 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/io/BaseEncoding.html#lowerCase() –

+0

@PeterDeGlopper很好的發現,我已經更新了答案,以便代碼現在可以處理帶有小寫和大寫字符的字符串。 –

42
byte[] myvar = "Any String you want".getBytes(); 
+38

根據海報的需要,是否將字符串'「0000」'變成'{0x30,0x30,0x30,0x30}'(ASCII)而不是'{0x00,0x00,0x00,0x00}'(二進制)? – jww

+6

你沒有回答正確的問題。 –

+1

而這獲得了52 upvotes?!愛維伊。 –

-5
byte[] responseBody = "Invalid Domain Alias".getBytes(); 
1

在這種情況下我的優選的選擇是使用org.apache.commons.codec.binary.Hex具有用於Stringÿ十六進制和二進制之間的轉換是有用的API。例如:

  1. Hex.decodeHex(char[] data)是否存在陣列中的非十六進制字符,其拋出一個DecoderException,或者如果有奇數數量的字符。

  2. Hex.encodeHex(byte[] data)是上面的解碼方法的對應物,並且吐出了char[]

  3. Hex.encodeHexString(byte[] data)它將byte數組轉換回String

用法:Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())

-2
private static final int[] CDRIVES = new int[] {0xe0, 0xf4, ...}; 

和訪問之後轉換爲字節。

0

沒有圖書館解決辦法,動態長度返回,無符號整數解釋(不補)

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 }; 
    } 
}