Prefacio
Cuando Java se comunica con programas escritos en otros idiomas en el socket TCP/IP, el contenido de comunicación generalmente se convierte en tipo de matriz byte , y Java también es muy conveniente para convertir caracteres y matrices. Déjame aprender sobre el principio de convertir cadenas y byte
principio
Todos sabemos que en Java, el tipo byte toma 1 byte, es decir, 8 bits, mientras que los caracteres hexadecimales ocupan 4 bits, por lo que cada byte puede ser representado por dos caracteres y viceversa.
Dar un ejemplo
byte = 123
En representación binaria: 0111 1011
Cada 4 dígitos están representados por caracteres: 7 b
Sí, el principio es simple, implementémoslo con código:
byte [] a la cadena hexadecimal
Método 1
Idea: primero convierta byte[] a char[] dimensional, y luego convierta char[] en cadena
public static String bytes2Hex (byte [] src) {if (src == null || src.length <= 0) {return null; } char [] res = nuevo char [src.length * 2]; // Cada byte corresponde a dos caracteres finales 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]; // Guardar los 4 bits altos de byte First Res [j ++] = hexdigits [src [i] & 0x0f]; // Guardar los 4 bits bajos de byte nuevamente} return New String (res); } Método 2
Idea: primero convierta byte a tipo int , luego convierta a cadena
public static string bytestoHex (byte [] src) {if (src == null || src.length <= 0) {return null; } StringBuilder StringBuilder = new StringBuilder (""); para (int i = 0; i <src.length; i ++) {// La razón para usar byte y 0xff se combinará es porque int es 32 bits. Después de coincidir con 0xff, los primeros 24 bits se descartan, y solo los últimos 8 bits se conservan Str = Integer.ToHexString (Src [i] & 0xff); if (str.length () <2) {// Si se necesitan menos de dos bits, se debe agregar 0 stringBuilder.append (0); } stringBuilder.append (str); } return StringBuilder.ToString (); } Cadena hexadecimal a byte []
Idea: primero convierta la cadena en char[] , luego conviértala en byte[]
Public static byte [] hextobytes (String hexString) {if (hexString == null || hexString.equals ("")) {return null; } int longitud = hexString.length () / 2; char [] hexchars = hexString.ToCarArray (); byte [] bytes = new byte [longitud]; Cadena hexDigits = "0123456789ABCDEF"; para (int i = 0; i <longitud; i ++) {int pos = i * 2; // Dos caracteres corresponden a un byte int h = hexdigits.indexof (hexchars [pos]) << 4; // nota 1 int l = hexdigits.indexof (hexchars [pos + 1]); // nota 2 if (h == -1 || l == -1) {// caracteres no hexadecimales return null; } bytes [i] = (byte) (h | l); } bytes de retorno; } Nota: La nota 1 obtiene xxxx0000 , nota 2 obtiene 0000xxxx y luego convierte dos caracteres en un byte .
Dar otro ejemplo
cifrado MD5
public static string getMd5byFile (archivo archivo) {string ret = null; FileInputStream fis = null; intente {fis = new FileInputStream (archivo); MessageDigest MD = MessageGest.getInstance ("MD5"); byte [] buffer = new Byte [1024]; int len; while ((len = fis.read (buffer))> 0) {md.update (buffer, 0, len); } ret = bytes2hex (md.digest ()); // Convertir el byte cifrado MD5 [] en una cadena} Catch (Exception e) {E.PrintStackTrace (); } finalmente {if (fis! = null) {try {fis.close (); } catch (ioException e) {E.PrintStackTrace (); }}} return return; }Resumir
Ok, debería entender, no es difícil. Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo sea de ayuda para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.