如何在Java中初始化一个字节数组?

我必须以字节数组forms存储一些常量值(UUID)在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" }; 

使用一个函数将hexastring转换为byte[] ,你可以这样做

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

我build议你使用由Dave L定义的函数将hex转储的string表示forms转换为使用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 ,性能下降是无关紧要的。

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

在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()); 

当您使用小arrays时,Guava方法是矫枉过正的。 但番石榴也有可以parsinginputstream的版本。 处理大的hexinput时,这是一个很好的function。

您可以使用Java UUID类来存储这些值,而不是字节数组:

 UUID public UUID(long mostSigBits, long leastSigBits) 

使用指定的数据构造一个新的UUID。 mostSigBits用于UUID的最高有效64位,leastSigBits成为UUID的最低有效64位。

就一个干净的过程而言,你可以使用ByteArrayOutputStream对象…

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

//将所有的值逐个写入bObj

 bObj.write(byte value) 

//完成后可以使用byte []

 CDRIVES = bObj.toByteArray(); 

//比你可以重复类似CMYDOCS和IEFRAME的过程,

注意如果你真的有小阵,这不是一个有效的解决scheme。

在这种情况下,我的首选选项是使用org.apache.commons.codec.binary.Hex ,它具有用于在String y hex和binary之间进行转换的有用API。 例如:

  1. Hex.decodeHex(char[] data)如果数组中有非hex字符,或者有奇数个字符,则抛出DecoderException

  2. Hex.encodeHex(byte[] data)是上面解码方法的对象,并且吐出char[]

  3. Hex.encodeHexString(byte[] data)byte数组转换回String

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

没有库的解决scheme,返回的dynamic长度,无符号整数解释(不是二进制补码)

  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 }; } } 
 private static final int[] CDRIVES = new int[] {0xe0, 0xf4, ...}; 

并在访问后转换为字节。

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