Muszę przechowywać pewne wartości stałe (UUID) w postaci tablicy bajtów w java i zastanawiam się, jaki byłby najlepszy sposób na zainicjowanie tych tablic statycznych. Tak właśnie teraz to robię, ale czuję, że musi być lepszy sposób.
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
Czy jest coś, czego mógłbym użyć, co mogłoby być mniej wydajne, ale wyglądałoby czyściej? na przykład:
private static final byte[] CDRIVES =
new byte[] { "0xe04fd020ea3a6910a2d808002b30309d" };
"0000"
na{0x30,0x30,0x30,0x30}
(ASCII) zamiast{0x00,0x00,0x00,0x00}
(binarne), zgodnie z życzeniem plakatu?W Javie 6 jest metoda, która robi dokładnie to, co chcesz:
Alternatywnie możesz użyć Google Guava :
Metoda Guava to przesada, gdy używasz małych tablic. Ale Guava ma również wersje, które mogą analizować strumienie wejściowe. Jest to fajna funkcja, gdy mamy do czynienia z dużymi danymi szesnastkowymi.
źródło
base16().lowerCase().decode(...)
jeśli masz cyfry szesnastkowe z małymi literami. docs.guava-libraries.googlecode.com/git/javadoc/com/google/…javax.xml.bind
został niestety usunięty w Javie 9.Możesz użyć klasy Java UUID do przechowywania tych wartości zamiast tablic bajtowych:
Konstruuje nowy identyfikator UUID przy użyciu określonych danych. MostSigBits jest używany dla najbardziej znaczących 64 bitów UUID, a najmniejSigBits staje się najmniej znaczącymi 64 bitami UUID.
źródło
Jeśli chodzi o czysty proces, możesz użyć obiektu ByteArrayOutputStream ...
// zapisz po kolei wszystkie wartości do bObj, używając
// kiedy skończysz, możesz pobrać bajt [] używając
// niż możesz powtórzyć podobny proces również dla CMYDOCS i IEFRAME,
UWAGA Nie jest to wydajne rozwiązanie, jeśli masz naprawdę małą macierz.
źródło
Rozwiązanie bez bibliotek, zwracana dynamiczna długość, interpretacja liczb całkowitych bez znaku (nie dopełnienie do dwóch)
źródło
Moją preferowaną opcją w tej sytuacji jest użycie,
org.apache.commons.codec.binary.Hex
który ma przydatne interfejsy API do konwersji z wartościString
szesnastkowej y na binarną. Na przykład:Hex.decodeHex(char[] data)
który generuje znak,DecoderException
jeśli w tablicy znajdują się znaki inne niż szesnastkowe lub jeśli jest nieparzysta liczba znaków.Hex.encodeHex(byte[] data)
jest odpowiednikiem powyższej metody dekodowania i wypluwa plikchar[]
.Hex.encodeHexString(byte[] data)
który konwertuje z powrotem zbyte
tablicy na plikString
.Stosowanie:
Hex.decodeHex("dd645a2564cbe648c8336d2be5eafaa6".toCharArray())
źródło
Możesz użyć tej funkcji narzędzia:
W przeciwieństwie do wariantów Denys Séguret i stefan.schwetschke, umożliwia wstawianie symboli separatorów (spacji, tabulatorów itp.) Do ciągu wejściowego, dzięki czemu jest bardziej czytelny.
Przykład użycia:
źródło
Najmniejszy typ wewnętrzny, który w czasie kompilacji może być przypisany liczbami szesnastkowymi to char , as
Aby mieć równoważną tablicę bajtów, można wdrożyć konwersje jako
źródło
a po uzyskaniu dostępu zamień na bajt.
źródło