Prefácio
Quando o Java se comunica com programas escritos em outros idiomas no soquete TCP/IP, o conteúdo de comunicação geralmente é convertido em tipo de matriz byte , e o Java também é muito conveniente para converter caracteres e matrizes. Deixe -me aprender sobre o princípio da conversão de cordas e byte
princípio
Todos sabemos que em Java, o tipo byte leva 1 byte, ou seja, 8 bits, enquanto os caracteres hexadecimais ocupam 4 bits, para que cada byte possa ser representado por dois caracteres e vice -versa.
Dê um exemplo
byte = 123
Na representação binária: 0111 1011
Cada 4 dígitos são representados por caracteres: 7 b
Sim, o princípio é simples, vamos implementá -lo com o código:
byte [] para string hexadecimal
Método 1
Ideia: primeiro converta byte[] em char[] e depois converta char[] para string
public static string bytes2hex (byte [] src) {if (src == null || src.length <= 0) {return null; } char [] res = novo char [src.length * 2]; // Cada byte corresponde a dois caracteres char hexdigits [] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'd', 'e', 'f'}; for (int i = 0, j = 0; i <src.length; i ++) {res [j ++] = hexdigits [src [i] >> 4 & 0x0f]; // Salve os 4 bits altos de byte primeiro res [j ++] = hexdigits [src [i] e 0x0f]; // salve os 4 bits baixos de byte novamente} retorna nova string (res); } Método 2
Ideia: primeiro converta byte em tipo int e depois converta em string
public static string bytestohex (byte [] src) {if (src == null || src.length <= 0) {return null; } Stringbuilder stringbuilder = new stringbuilder (""); for (int i = 0; i <src.length; i ++) {// O motivo do uso de byte e 0xFF deve ser combinado é porque o int é de 32 bits. Depois de combinar com 0xFF, os primeiros 24 bits são descartados e apenas os últimos 8 bits são retidos string str = inteiro.tohexString (src [i] e 0xff); if (str.Length () <2) {// Se for necessário menos de dois bits, 0 deverá ser adicionado stringbuilder.append (0); } stringbuilder.append (str); } return stringbuilder.toString (); } String hexadecimal para byte []
Ideia: primeiro converta a string para char[] , depois converta -a em byte[]
public static byte [] hextobytes (string hexstring) {if (hexstring == null || hexstring.equals ("")) {return null; } int length = hexstring.length () / 2; char [] hexchars = hexstring.toCharArray (); byte [] bytes = novo byte [comprimento]; String hexdigits = "0123456789ABCDEF"; for (int i = 0; i <comprimento; i ++) {int pos = i * 2; // Dois caracteres correspondem a um byte int h = hexdigits.indexof (hexchars [pos]) << 4; // nota 1 int l = hexdigits.indexOf (hexchars [pos + 1]); // nota 2 se (h == -1 || l == -1) {// caracteres não -hexadecimais retornam nulo; } bytes [i] = (byte) (h | l); } retornar bytes; } NOTA: Nota 1 Obtém xxxx0000 , a nota 2 recebe 0000xxxx e depois converte dois caracteres em um byte .
Dê outro exemplo
Criptografia MD5
public static string getMd5byfile (arquivo de arquivo) {string ret = null; FileInputStream fis = null; tente {fis = new FileInputStream (arquivo); Messagedigest md = Messagedigest.getInstance ("md5"); byte [] buffer = novo byte [1024]; int len; while ((len = fis.read (buffer))> 0) {md.update (buffer, 0, len); } ret = bytes2hex (md.digest ()); // Converter md5 byte criptografado [] em uma string} catch (Exceção e) {e.printStackTrace (); } finalmente {if (fis! = null) {tente {fis.close (); } catch (ioexception e) {e.printStackTrace (); }}} retornar retornar; }Resumir
Ok, eu deveria entender, não é difícil. O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo seja de ajuda para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.