Tengo que almacenar algunos valores constantes (UUID) en forma de matriz de bytes en Java, y me pregunto cuál sería la mejor manera de inicializar esas matrices estáticas. Así es como lo estoy haciendo actualmente, pero siento que debe haber una mejor manera.
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
¿Hay algo que pueda usar que pueda ser menos eficiente, pero que se vea más limpio? por ejemplo:
private static final byte[] CDRIVES =
new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };
"0000"
a{0x30,0x30,0x30,0x30}
(ASCII) en lugar de{0x00,0x00,0x00,0x00}
(binario) como lo desea el póster?En Java 6, hay un método que hace exactamente lo que quieres:
Alternativamente, podría usar Google Guava :
El método de la guayaba es exagerado, cuando está utilizando matrices pequeñas. Pero Guava también tiene versiones que pueden analizar flujos de entrada. Esta es una buena característica cuando se trata de grandes entradas hexadecimales.
fuente
base16().lowerCase().decode(...)
si tiene dígitos hexadecimales en minúsculas. docs.guava-libraries.googlecode.com/git/javadoc/com/google/…javax.xml.bind
fue eliminado tristemente en Java 9.Puede usar la clase UUID de Java para almacenar estos valores, en lugar de las matrices de bytes:
Construye un nuevo UUID utilizando los datos especificados. mostSigBits se utiliza para los 64 bits más significativos del UUID y leastSigBits se convierte en los 64 bits menos significativos del UUID.
fuente
En lo que respecta a un proceso limpio, puede usar el objeto ByteArrayOutputStream ...
// escribe todos los valores en bObj uno por uno usando
// cuando termines puedes obtener el byte [] usando
// de lo que puedes repetir el proceso similar para CMYDOCS e IEFRAME también,
NOTA Esta no es una solución eficiente si realmente tiene una matriz pequeña.
fuente
Una solución sin bibliotecas, longitud dinámica devuelta, interpretación entera sin signo (no complemento de dos)
fuente
Mi opción preferida en esta circunstancia es usar
org.apache.commons.codec.binary.Hex
las API útiles para convertir entreString
hexadecimal y binario. Por ejemplo:Hex.decodeHex(char[] data)
que arroja unDecoderException
si hay caracteres no hexadecimales en la matriz, o si hay un número impar de caracteres.Hex.encodeHex(byte[] data)
es la contraparte del método de decodificación anterior y escupe elchar[]
.Hex.encodeHexString(byte[] data)
que convierte de nuevo de unabyte
matriz a aString
.Uso:
Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())
fuente
Puede usar esta función de utilidad:
A diferencia de las variantes de Denys Séguret y stefan.schwetschke, permite insertar símbolos de separación (espacios, tabulaciones, etc.) en la cadena de entrada, lo que lo hace más legible.
Ejemplo de uso:
fuente
El tipo interno más pequeño, que en tiempo de compilación puede asignarse por números hexadecimales es char , como
Para tener una matriz de bytes equivalente, uno podría implementar conversiones como
fuente
y después del acceso convertir a byte.
fuente