Chcę przekonwertować dowolną długość ciągu do BYTE32 w Javie.

Kod

String s="9c46267273a4999031c1d0f7e40b2a59233ce59427c4b9678d6c3a4de49b6052e71f6325296c4bddf71ea9e00da4e88c4d4fcbf241859d6aeb41e1714a0e";

//Convert into byte32
-1
Priyanka Kanse 5 czerwiec 2018, 11:39

3 odpowiedzi

Najlepsza odpowiedź

Od komentarzy stało się jasne, że chcesz zmniejszyć przestrzeń do przechowywania tego ciągu do 32 bajtów.

Dany ciąg może być łatwo skompresowany z 124 bajtów do 62 bajtów, wykonując konwersję szesnastkową.

Nie ma jednak algorytmu i nie będzie algorytmu, który może skompresować dowolne dane do 32 bajtów. Wyobraź sobie, że byłoby to możliwe: byłoby to wdrożone i byłbyś w stanie uzyskać pliki ZIP tylko 32 bajtów dla dowolnego pliku, który kompresujesz.

Niestety, odpowiedź brzmi: nie jest to możliwe.

3
Thomas Weller 5 czerwiec 2018, 09:03

Nie możesz konwertować dowolnego ciągu łańcucha do tablicy bajtowej o długości 32.

Java używa UTF-16, ponieważ jest to kodowanie łańcucha, aby przechowywać 100% sznurka, 1: 1 jako tablicę bajtową o stałej długości, byłoby na spojrzeniu na spojrzenie na powierzchnię, należy ograniczyć do 16 znaków.

Jeśli chcesz żyć z ograniczeniem 16 znaków, bajt [] bajtów = s.getbytes (); Powinien zapewnić tablicę bajtów o długości , ale najlepiej określić wyraźne kodowanie. na przykład byte [] array2 = str.getBytes("UTF-16");

Nie rozwiązuje tego problemu. Teraz prawdopodobnie będziesz musiał sprawdzić, czy tablica bajtów nie przekracza 32 bajtów i wymyśli strategie wyściółki, możliwe zakończenie zerowe (co może potencjalnie jeść w budżecie postaci)

Teraz, jeśli nie potrzebujesz całej przestrzeni łańcuchowej UTF-16, że Java używa domyślnie dla łańcuchów, możesz uciec z dłuższymi ciągami, używając innych kodingów.

Jeśli ma być wykorzystywany do dowolnego rodzaju innego standardu lub czegoś takiego (widzę odniesienia do rzuconej w etherium), trzeba będzie śledzić normy .

Chyba że piszesz własną bibliotekę do radzenia sobie z nim bezpośrednio, bardzo polecam korzystanie z biblioteki, która już istnieje i wydaje się być dobrze przetestowana i używana.

1
Ryan The Leach 5 czerwiec 2018, 09:06

Możesz osiągnąć następującą funkcję

byte[] bytes = s.getBytes();
-2
Ahmed Jahanzaib 5 czerwiec 2018, 08:41