Por favor edite sua pergunta para mostrar o código você tem até agora . Você deve incluir pelo menos um esboço (mas de preferência um exemplo reproduzível mínimo ) do código com o qual está tendo problemas, então podemos tentar ajudar com o problema específico. Você também deve ler Como perguntar .
Toby Speight
Respostas:
201
Esta é uma maneira resumida de convertê-lo em hexadecimal:
Este método é realmente o correto. Tente byte[] data = { -1, 1 };- o código nesta resposta funciona bem, enquanto aquele com 17 votos positivos falha.
hudolejev
1
É possível obter um byte com valor -1de uma string (como foi solicitado no exemplo)?
Kaleb Pederson
@KalebPederson Sim. Não é nem muito difícil. . Se a codificação escolhida alguma vez usar o bit mais significativo de qualquer caractere (digamos, como UTF- * do), você terá bytes negativos em seu array.
@MelNicholson há uma função decodeHex em Hex para ir para um byte []. Você precisa usar isso porque nada garante que uma string HEX aleatória possa ser convertida em uma string em sua codificação.
BxlSofty
18
Os números que você codifica em hexadecimal devem representar alguma codificação dos caracteres, como UTF-8. Portanto, primeiro converta a string em um byte [] que representa a string nessa codificação e, em seguida, converta cada byte em hexadecimal.
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);}
Esta é uma solução interessante e que atinge o cerne da representação digital de dados. Você poderia explicar o que está fazendo e o que os "números mágicos" em sua solução representam? Um recém-chegado pode não saber o que significa o operador >>>, por que usamos o bit a bit-and & junto com uma máscara de 0xF0, ou por que o array chars tem o tamanho [2 * buf.length].
Nota : Isso causa um pequeno problema extra com Java 9e mais recentes, pois a API não é incluída por padrão. Para referência, por exemplo, consulte estaGitHub edição.
Legal, mas eu usaria format("%02x")então format () sempre usa 2 caracteres. Mesmo que ASCII seja hexadecimal de dois dígitos, ou seja, A = 0x65
mike jones
8
Todas as respostas baseadas em String.getBytes () envolvem a codificação de sua string de acordo com um Charset. Você não obtém necessariamente o valor hexadecimal dos caracteres de 2 bytes que compõem sua string. Se o que você realmente quer é o equivalente a um visualizador hexadecimal, você precisa acessar os caracteres diretamente. Esta é a função que uso em meu código para depurar problemas Unicode:
Isso é bom se o que você deseja é ver a representação interna dos caracteres Java, que é UTF-16, uma representação específica de 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
Você pode retornar hexStringneste ponto, com a ressalva de que os caracteres nulos iniciais serão removidos e o resultado terá um comprimento ímpar se o primeiro byte for menor que 16. Se precisar lidar com esses casos, você pode adicionar algum código extra para preencher com 0s:
Isso não é uma solução. A questão é como obter a representação hexadecimal do conteúdo de uma String arbitrária e fornecer especificamente "testing123" como exemplo.
Skomisa
1
Usando a ajuda de vários povos de vários threads ..
Eu sei que isso foi respondido, mas gostaria de fornecer um método completo de codificação e decodificação para qualquer outro na minha mesma situação.
Aqui estão meus métodos de codificação e decodificação.
// 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;}
Aqui estão alguns benchmarks que comparam diferentes abordagens e bibliotecas. O Guava vence o Apache Commons Codec na decodificação. Commons Codec vence Guava na codificação. E JHex supera ambos na decodificação e codificação.
Tudo está em um único arquivo de classe para JHex . Sinta-se à vontade para copiar e colar se não quiser outra biblioteca em sua árvore de dependências. Observe também que ele está disponível apenas como jar Java 9 até que eu possa descobrir como publicar vários destinos de lançamento com o Gradle e o plug-in Bintray.
Uma maneira curta e conveniente de converter uma String em sua notação hexadecimal é:
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());}
Respostas:
Esta é uma maneira resumida de convertê-lo em hexadecimal:
fonte
BigInteger(int,byte[])
construtor; caso contrário, se o primeiro byte for negativo, você obterá um BigInteger negativo.Para garantir que o hexadecimal tenha sempre 40 caracteres, o BigInteger deve ser positivo:
fonte
byte[] data = { -1, 1 };
- o código nesta resposta funciona bem, enquanto aquele com 17 votos positivos falha.-1
de uma string (como foi solicitado no exemplo)?byte
s negativos em seu array.http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html
fonte
Os números que você codifica em hexadecimal devem representar alguma codificação dos caracteres, como UTF-8. Portanto, primeiro converta a string em um byte [] que representa a string nessa codificação e, em seguida, converta cada byte em hexadecimal.
fonte
Use
DatatypeConverter.printHexBinary()
:Exemplo de uso:
Impressões:
Nota : Isso causa um pequeno problema extra com
Java 9
e mais recentes, pois a API não é incluída por padrão. Para referência, por exemplo, consulte estaGitHub
edição.fonte
Aqui uma outra solução
fonte
format("%02x")
então format () sempre usa 2 caracteres. Mesmo que ASCII seja hexadecimal de dois dígitos, ou seja, A = 0x65Todas as respostas baseadas em String.getBytes () envolvem a codificação de sua string de acordo com um Charset. Você não obtém necessariamente o valor hexadecimal dos caracteres de 2 bytes que compõem sua string. Se o que você realmente quer é o equivalente a um visualizador hexadecimal, você precisa acessar os caracteres diretamente. Esta é a função que uso em meu código para depurar problemas Unicode:
Em seguida, stringToHex ("testing123") fornecerá a você:
fonte
Você pode retornar
hexString
neste ponto, com a ressalva de que os caracteres nulos iniciais serão removidos e o resultado terá um comprimento ímpar se o primeiro byte for menor que 16. Se precisar lidar com esses casos, você pode adicionar algum código extra para preencher com 0s:fonte
Para obter o valor inteiro de hex
fonte
Converta uma letra em código hexadecimal e um código hexadecimal em letras.
fonte
Eu sugeriria algo assim, onde
str
está sua string de entrada:fonte
Primeiro, converta-o em bytes usando a função getBytes () e depois converta-o em hexadecimal usando o seguinte:
fonte
Para ir na outra direção (hex para string), você pode usar
fonte
fonte
fonte
Converter String em Hexadecimal :
definitivamente esta é a maneira mais fácil.
fonte
Usando a ajuda de vários povos de vários threads ..
Eu sei que isso foi respondido, mas gostaria de fornecer um método completo de codificação e decodificação para qualquer outro na minha mesma situação.
Aqui estão meus métodos de codificação e decodificação.
fonte
Muito melhor:
fonte
Aqui estão alguns benchmarks que comparam diferentes abordagens e bibliotecas. O Guava vence o Apache Commons Codec na decodificação. Commons Codec vence Guava na codificação. E JHex supera ambos na decodificação e codificação.
Exemplo JHex
Tudo está em um único arquivo de classe para JHex . Sinta-se à vontade para copiar e colar se não quiser outra biblioteca em sua árvore de dependências. Observe também que ele está disponível apenas como jar Java 9 até que eu possa descobrir como publicar vários destinos de lançamento com o Gradle e o plug-in Bintray.
fonte
Uma maneira curta e conveniente de converter uma String em sua notação hexadecimal é:
fonte
verifique esta solução para String para hex e hex para String vice-versa
Saída da seguinte forma:
fonte