Proszę edytować swoje pytanie pokazać kod do tej pory . Powinieneś dołączyć przynajmniej zarys (ale najlepiej minimalny powtarzalny przykład ) kodu, z którym masz problemy, wtedy możemy spróbować pomóc w konkretnym problemie. Przeczytaj również artykuł Jak pytać .
Ta metoda jest w rzeczywistości poprawna. Wypróbuj byte[] data = { -1, 1 };- kod w tej odpowiedzi działa dobrze, podczas gdy ten z 17 głosami za nieudany.
hudolejev
1
Czy można pobrać bajt z wartością -1z ciągu (zgodnie z żądaniem w przykładzie)?
Kaleb Pederson
@KalebPederson Yes. Nie jest to nawet bardzo trudne. . Jeśli wybrane przez ciebie kodowanie kiedykolwiek używa najbardziej znaczącego bitu dowolnego znaku (powiedzmy, jak UTF- * do), masz bytew tablicy ujemne wartości .
@MelNicholson jest funkcja decodeHex w Hex, aby przejść do bajtu []. Musisz tego użyć, ponieważ nic nie gwarantuje, że losowy ciąg HEX może zostać przekonwertowany na ciąg w twoim kodowaniu.
BxlSofty
18
Liczby zakodowane w formacie szesnastkowym muszą odpowiadać kodowaniu znaków, na przykład UTF-8. Więc najpierw przekonwertuj String na bajt [] reprezentujący łańcuch w tym kodowaniu, a następnie przekonwertuj każdy bajt na szesnastkowy.
publicstaticString hexadecimal(String input,String charsetName)throwsUnsupportedEncodingException{if(input ==null)thrownewNullPointerException();return asHex(input.getBytes(charsetName));}privatestaticfinalchar[] HEX_CHARS ="0123456789abcdef".toCharArray();publicstaticString asHex(byte[] buf){char[] chars =newchar[2* buf.length];for(int i =0; i < buf.length;++i){
chars[2* i]= HEX_CHARS[(buf[i]&0xF0)>>>4];
chars[2* i +1]= HEX_CHARS[buf[i]&0x0F];}returnnewString(chars);}
To ciekawe rozwiązanie, które uderza w sedno cyfrowej reprezentacji danych. Czy mógłbyś jednak wyjaśnić, co robisz i co oznaczają „magiczne liczby” w twoim rozwiązaniu? Nowicjusz może nie wiedzieć, co oznacza operator >>>, dlaczego używamy bitowego-i & wraz z maską 0xF0 lub dlaczego tablica znaków ma rozmiar [2 * buf.length].
Uwaga : powoduje to dodatkowe problemy w przypadku Java 9nowszych wersji, ponieważ interfejs API nie jest domyślnie dołączony. Dla odniesienia, np. Zobacz tenGitHub numer.
Fajnie, ale użyłbym, format("%02x")więc format () zawsze używa 2 znaków. Mimo że ASCII to dwucyfrowe szesnastkowe, tj. A = 0x65
mike jones,
8
Wszystkie odpowiedzi oparte na String.getBytes () obejmują kodowanie ciągu zgodnie z Charset. Niekoniecznie dostajesz wartość szesnastkową 2-bajtowych znaków, które tworzą twój ciąg. Jeśli to, czego naprawdę chcesz, jest odpowiednikiem przeglądarki szesnastkowej, musisz uzyskać bezpośredni dostęp do znaków. Oto funkcja, której używam w moim kodzie do debugowania problemów z Unicode:
Jest to dobre, jeśli chcesz zobaczyć wewnętrzną reprezentację znaków Java, którą jest UTF-16, specyficzna reprezentacja Unicode.
Jonathan Rosenne
5
byte[] bytes = string.getBytes(CHARSET);// you didn't say what charset you wantedBigInteger bigInt =newBigInteger(bytes);String hexString = bigInt.toString(16);// 16 is the radix
Możesz powrócić hexStringw tym momencie, z zastrzeżeniem, że wiodące znaki zerowe zostaną usunięte, a wynik będzie miał nieparzystą długość, jeśli pierwszy bajt jest mniejszy niż 16. Jeśli musisz obsłużyć te przypadki, możesz dodać dodatkowy kod do wypełnienia zerami:
To nie jest rozwiązanie. Pytanie brzmi: jak uzyskać szesnastkową reprezentację zawartości dowolnego ciągu, a konkretnie podano „testing123” jako przykład.
skomisa
1
Korzystanie z pomocy wielu osób z wielu wątków.
Wiem, że udzielono odpowiedzi, ale chciałbym podać pełną metodę kodowania i dekodowania dla wszystkich innych w tej samej sytuacji.
Oto moje metody kodowania i dekodowania.
// Global Charset EncodingpublicstaticCharset encodingType =StandardCharsets.UTF_8;// Text To HexpublicstaticString textToHex(String text){byte[] buf =null;
buf = text.getBytes(encodingType);char[] HEX_CHARS ="0123456789abcdef".toCharArray();char[] chars =newchar[2* buf.length];for(int i =0; i < buf.length;++i){
chars[2* i]= HEX_CHARS[(buf[i]&0xF0)>>>4];
chars[2* i +1]= HEX_CHARS[buf[i]&0x0F];}returnnewString(chars);}// Hex To TextpublicstaticString hexToText(String hex){int l = hex.length();byte[] data =newbyte[l /2];for(int i =0; i < l; i +=2){
data[i /2]=(byte)((Character.digit(hex.charAt(i),16)<<4)+Character.digit(hex.charAt(i +1),16));}String st =newString(data, encodingType);return st;}
Oto kilka wzorców porównujących różne podejścia i biblioteki. Guawa pokonuje kodek Apache Commons w dekodowaniu. Commons Codec pokonuje guawę w kodowaniu. JHex pokonuje je zarówno pod względem dekodowania, jak i kodowania.
Wszystko jest w jednym pliku klasy dla JHex . Możesz skopiować wklej, jeśli nie chcesz mieć kolejnej biblioteki w drzewie zależności. Zauważ też, że jest dostępny tylko jako jar Java 9, dopóki nie dowiem się, jak opublikować wiele celów wydania za pomocą Gradle i wtyczki Bintray.
Krótkim i wygodnym sposobem konwersji ciągu znaków na zapis szesnastkowy jest:
publicstaticvoid main(String... args){String str ="Hello! This is test string.";char ch[]= str.toCharArray();StringBuilder sb =newStringBuilder();for(int i =0; i < ch.length; i++){
sb.append(Integer.toHexString((int) ch[i]));}System.out.println(sb.toString());}
Odpowiedzi:
Oto krótki sposób przekształcenia go na hex:
źródło
BigInteger(int,byte[])
konstruktora; w przeciwnym razie, jeśli pierwszy bajt jest ujemny, otrzymasz ujemną wartość BigInteger.Aby mieć pewność, że szesnastka ma zawsze 40 znaków, BigInteger musi być dodatnia:
źródło
byte[] data = { -1, 1 };
- kod w tej odpowiedzi działa dobrze, podczas gdy ten z 17 głosami za nieudany.-1
z ciągu (zgodnie z żądaniem w przykładzie)?byte
w tablicy ujemne wartości .http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html
źródło
Liczby zakodowane w formacie szesnastkowym muszą odpowiadać kodowaniu znaków, na przykład UTF-8. Więc najpierw przekonwertuj String na bajt [] reprezentujący łańcuch w tym kodowaniu, a następnie przekonwertuj każdy bajt na szesnastkowy.
źródło
Zastosowanie
DatatypeConverter.printHexBinary()
:Przykładowe użycie:
Wydruki:
Uwaga : powoduje to dodatkowe problemy w przypadku
Java 9
nowszych wersji, ponieważ interfejs API nie jest domyślnie dołączony. Dla odniesienia, np. Zobacz tenGitHub
numer.źródło
Tutaj inne rozwiązanie
źródło
format("%02x")
więc format () zawsze używa 2 znaków. Mimo że ASCII to dwucyfrowe szesnastkowe, tj. A = 0x65Wszystkie odpowiedzi oparte na String.getBytes () obejmują kodowanie ciągu zgodnie z Charset. Niekoniecznie dostajesz wartość szesnastkową 2-bajtowych znaków, które tworzą twój ciąg. Jeśli to, czego naprawdę chcesz, jest odpowiednikiem przeglądarki szesnastkowej, musisz uzyskać bezpośredni dostęp do znaków. Oto funkcja, której używam w moim kodzie do debugowania problemów z Unicode:
Następnie stringToHex ("testing123") daje:
źródło
Możesz powrócić
hexString
w tym momencie, z zastrzeżeniem, że wiodące znaki zerowe zostaną usunięte, a wynik będzie miał nieparzystą długość, jeśli pierwszy bajt jest mniejszy niż 16. Jeśli musisz obsłużyć te przypadki, możesz dodać dodatkowy kod do wypełnienia zerami:źródło
Aby uzyskać całkowitą wartość hex
źródło
Zamień literę na kod szesnastkowy i kod szesnastkowy na literę.
źródło
Sugerowałbym coś takiego, gdzie
str
jest twój ciąg wejściowy:źródło
Najpierw przekonwertuj go na bajty za pomocą funkcji getBytes (), a następnie przekonwertuj na szesnastkowy, używając tego:
źródło
Aby przejść w drugą stronę (szesnastkowo na ciąg), możesz użyć
źródło
źródło
źródło
Konwertuj ciąg na szesnastkowy :
zdecydowanie jest to łatwa droga.
źródło
Korzystanie z pomocy wielu osób z wielu wątków.
Wiem, że udzielono odpowiedzi, ale chciałbym podać pełną metodę kodowania i dekodowania dla wszystkich innych w tej samej sytuacji.
Oto moje metody kodowania i dekodowania.
źródło
Dużo lepiej:
źródło
Oto kilka wzorców porównujących różne podejścia i biblioteki. Guawa pokonuje kodek Apache Commons w dekodowaniu. Commons Codec pokonuje guawę w kodowaniu. JHex pokonuje je zarówno pod względem dekodowania, jak i kodowania.
Przykład JHex
Wszystko jest w jednym pliku klasy dla JHex . Możesz skopiować wklej, jeśli nie chcesz mieć kolejnej biblioteki w drzewie zależności. Zauważ też, że jest dostępny tylko jako jar Java 9, dopóki nie dowiem się, jak opublikować wiele celów wydania za pomocą Gradle i wtyczki Bintray.
źródło
Krótkim i wygodnym sposobem konwersji ciągu znaków na zapis szesnastkowy jest:
źródło
sprawdź, czy w tym rozwiązaniu Ciąg na szesnastkowy i szesnastkowy na Ciąg odwrotnie
Wyjście w następujący sposób:
źródło