byte array into hex string, hex string into byte array in java - jak najprościej ?
Filip Sielimowicz - 03-06-2006 00:15
byte array into hex string, hex string into byte array in java - jak najprościej ?
Przy konwersjach byte[] na zapis szesnastkowy generalnie używałem klasy BigInteger:
String byteArrayToHexString(byte[] myHexBytes) { return new BigInteger(myHexBytes).toString(16); }
Konwersja odwrotna jest równie trywialna:
byte[] hexStringToByteArray(String hexString) { return new BigInteger(hexString, 16).toByteArray(); }
Ale to ma jedną wadę: BigIntegery są zapisane ze znakiem, więc przy konwersji na hex string pojawiają się ujemne liczby szesnastkowe, np. -7af34b żeby tego uniknąć korzystam z innego konstruktora BigInteger, w którym jawnie podaje się znak:
String byteArrayToHexString(byte[] myHexBytes) { BigInteger unsignedBI = new BigInteger(1, myHexBytes); return unsignedBI.toString(16); }
Sprawa prosta, ale ... nie widzę tu prostej procedury symetrycznej ... Dla liczb ujemnych konwersja z powrotem ze Stringa na byte[] daje tablicę dłuższą o jeden bajt, z zerem na początku.
Jest gorzej ... Jeśli chcę to wykorzystać np. w podpisach elektronicznych to generalnie musę założyć, że w tablicy wejściowej mogę mieć np. same zera. Konwersja na BigInteger'a wszystko mi tu poucina wszystkie najstarsze zera.
Czyli generalnie pytanie brzmi: czy muszę pisać sam te konwersje, czy widzicie w standardowych bibliotekach javy już coś, co mi takie stringi wygeneruje i skonwertuje symetrycznie, zachowując wszelkie zera i nie kombinując nic ze znakami ? Jakiś NumberFormatter już może jest albo co ?
Piotr Kobzda - 06-06-2006 00:56
=?ISO-8859-2?Q?Re=3A_byte_array_into_hex_string=2C_h?==?ISO-8859-2?Q?ex_string_into_byte_array_in_java_-_jak_?==?ISO-8859-2?Q?najpro=B6ciej_=3F?=
Filip Sielimowicz wrote:
> Czyli generalnie pytanie brzmi: czy muszę pisać sam te konwersje, > czy widzicie w standardowych bibliotekach javy już coś, co mi takie stringi > wygeneruje i skonwertuje symetrycznie, zachowując wszelkie zera i nie > kombinując nic ze znakami ? Jakiś NumberFormatter już może jest albo co ?
AFAIK czegoś prostszego od BigDecimal w API raczej nie ma, trzeba to co podałeś tylko lekko rozwinąć:
public static String byteArrayToHexString(byte[] a) { return new BigInteger(1, a) .setBit(a.length << 3).toString(16).substring(1); }
public static byte[] hexStringToByteArray(String s) { byte[] a = new BigInteger(s, 16).abs() .setBit(s.length() << 2).toByteArray(); byte[] r = new byte[a.length - 1]; System.arraycopy(a, 1, r, 0, r.length); return r; }
Niestety zbyt piękne to to nie jest... :/
Jeśli możesz pozwolić sobie na dodatkową bibliotekę to np. w Apache Commons masz org.apache.commons.codec.bin.Hex z encodeHex() i decodeHex(), z którymi będzie prościej (BTW -- Commons też przydać Ci się może jeśli nagle stwierdzisz, że base64 bardziej niż hex jest Ci jednak potrzebny...).
Choć IMHO najlepiej jednak jest napisać to sobie wykorzystując np. forDigit() i digit() z Character, kilka raptem linijek kodu więcej, a masz to co Ci potrzebne, zawsze do dopieszczenia jakby coś nie grało.
Oczywiście możesz też skorzystać z Google. :) Ot choćby pierwszy hit dla "java hex string" parę alternatywnych rozwiązań podaje: http://mindprod.com/jgloss/hex.html
piotr
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
=?ISO-8859-2?Q?Re=3A_Informatyka=2C_Java=2C_EJB=2C_Ajax=2C?== ?ISO-8859-2?Q?_Spring=2E_Czy=BFby_to_koniec_=B6wiata=2C_czy? ==?ISO-8859-2?Q?_te=BF_nasze_uczelnie_b=EAd=B1_uczy=B3y_w_k?== ?ISO-8859-2?Q?o=F1cu!_czego_praktyczne?=
=?iso-8859-2?q?Informatyka,_Java,_EJB,_Ajax,_Spring=2E_Czy=BF by_to_koniec_=B6wiata,_czy_te=BF_nasze_uczelnie_b= EAd=B1_uczy=B3y_w_ko=F1cu!_czego_praktycznego_=2E= 2E=2E=2E?=
I spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa-JUG)
Przechodzenie FoxPro DBF -> Java most JDBC-ODBC - jak zrealizować RLOCK ?
Re: Projekty JSP, PHP, Java, SQL, C i C++ na zaliczenie!!
Skrypt zapisujacy formularz do pliku txt - java
Re: java 5-10 razy wolniejsza od php
Pomoc Pilnie potrzebna!!! JAVA testy
Wysylanie zakladek z programu Java do Worda
[ORACLE] Java Stored Procedures + JDBC
zanotowane.pldoc.pisz.plpdf.pisz.plsulimczyk.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|