2012-06-26 32 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 }; 
    } 
}