Eu tenho que armazenar alguns valores constantes (UUIDs) na forma de matriz de bytes em java, e estou me perguntando qual seria a melhor maneira de inicializar essas matrizes estáticas. É assim que estou fazendo atualmente, mas sinto que deve haver uma maneira melhor.
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
Existe algo que eu possa usar que seja menos eficiente, mas que pareça mais limpo? por exemplo:
private static final byte[] CDRIVES =
new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };
"0000"
em{0x30,0x30,0x30,0x30}
(ASCII), em vez de{0x00,0x00,0x00,0x00}
(binária), conforme desejado pelo pôster?No Java 6, existe um método que faz exatamente o que você deseja:
Como alternativa, você pode usar o Google Guava :
O método Guava é um exagero, quando você usa matrizes pequenas. Mas o Guava também possui versões que podem analisar fluxos de entrada. Esse é um recurso interessante ao lidar com grandes entradas hexadecimais.
fonte
base16().lowerCase().decode(...)
que você tenha dígitos hexadecimais em letras minúsculas. docs.guava-libraries.googlecode.com/git/javadoc/com/google/…javax.xml.bind
foi tristemente removido no Java 9.Você pode usar a classe Java UUID para armazenar esses valores, em vez de matrizes de bytes:
Constrói um novo UUID usando os dados especificados. mostSigBits é usado para os 64 bits mais significativos do UUID e lessSigBits se torna os 64 bits menos significativos do UUID.
fonte
No que diz respeito a um processo limpo, você pode usar o objeto ByteArrayOutputStream ...
// escreve todos os valores no bObj um por um usando
// quando terminar, você pode obter o byte [] usando
// do que você pode repetir o processo semelhante para CMYDOCS e IEFRAME também,
NOTA Esta não é uma solução eficiente se você realmente possui uma matriz pequena.
fonte
Uma solução sem bibliotecas, comprimento dinâmico retornado, interpretação de número inteiro não assinado (complemento não dois)
fonte
Minha opção preferida nessa circunstância é usar
org.apache.commons.codec.binary.Hex
APIs úteis para converter entreString
y hex e binário. Por exemplo:Hex.decodeHex(char[] data)
que gera aDecoderException
se houver caracteres não hexadecimais na matriz ou se houver um número ímpar de caracteres.Hex.encodeHex(byte[] data)
é a contraparte do método de decodificação acima e cospe ochar[]
.Hex.encodeHexString(byte[] data)
que converte de volta de umabyte
matriz para aString
.Uso:
Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())
fonte
Você pode usar esta função de utilitário:
Diferentemente das variantes do Denys Séguret e stefan.schwetschke, ele permite inserir símbolos separadores (espaços, tabulações etc.) na cadeia de entrada, tornando-a mais legível.
Exemplo de uso:
fonte
O menor tipo interno, que em tempo de compilação pode ser atribuído por números hexadecimais, é char , como
Para ter uma matriz de bytes equivalente, é possível implantar conversões como
fonte
e após o acesso converter para byte.
fonte