Este método es realmente el correcto. El byte[] data = { -1, 1 };código de prueba en esta respuesta funciona bien, mientras que el código de 17 votos a favor falla.
hudolejev
1
¿Es posible obtener un byte con valor -1de una cadena (como se solicitó en el ejemplo)?
Kaleb Pederson
@KalebPederson Sí. Ni siquiera es muy difícil. . Si la codificación elegida alguna vez usa el bit más significativo de cualquier carácter (digamos, como UTF- * do), tiene bytes negativos en su matriz.
@MelNicholson hay una función decodeHex en Hex para ir a un byte []. Debe usar eso porque nada garantiza que una cadena HEX aleatoria se pueda convertir en una cadena en su codificación.
BxlSofty
18
Los números que codifique en hexadecimal deben representar alguna codificación de los caracteres, como UTF-8. Entonces, primero convierta la Cadena en un byte [] que representa la cadena en esa codificación, luego convierta cada byte en 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 es una solución interesante y que ataca al núcleo de la representación digital de datos. Sin embargo, ¿podría explicar qué está haciendo y qué representan los "números mágicos" en su solución? Un recién llegado puede no saber qué significa el operador >>>, por qué usamos el bit a bit-and & junto con una máscara de 0xF0, o por qué la matriz de caracteres es de tamaño [2 * buf.length].
Nota : Esto causa un pequeño problema adicional Java 9y más nuevo, ya que la API no está incluida de forma predeterminada. Para referencia, por ejemplo, consulte esteGitHub número.
Bien, pero usaría format("%02x")así que format () siempre usa 2 caracteres. A pesar de que ASCII es hexagonal de dos dígitos es decir, A = 0x65
Mike Jones
8
Todas las respuestas basadas en String.getBytes () implican codificar su cadena de acuerdo con un Charset. No necesariamente obtener el valor hexadecimal de los 2 bytes caracteres que componen su cadena. Si lo que realmente desea es el equivalente a un visor hexadecimal, debe acceder a los caracteres directamente. Aquí está la función que uso en mi código para depurar problemas de Unicode:
Esto está bien si lo que desea es ver la representación interna de los caracteres Java, que es UTF-16, una representación 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
Puede regresar hexStringen este punto, con la advertencia de que los caracteres nulos iniciales se eliminarán y el resultado tendrá una longitud impar si el primer byte es menor que 16. Si necesita manejar esos casos, puede agregar un código adicional rellenar con ceros:
Gracias por la corrección, Software Monkey. Estaba bastante cansado cuando escribí la respuesta, y mi prueba para 'raw [i] <= 9' es claramente insuficiente.
rodion
1
Esto funciona realmente bien, ¿hay alguna manera de revertir el hexadecimal generado a la cadena nuevamente?
1
¿Dónde está str en esto?
Viswanath Lekshmanan
3
Primero conviértalo en bytes usando la función getBytes () y luego conviértalo en hexadecimal usando esto:
Esta no es una solución. La pregunta es cómo obtener la representación hexadecimal del contenido de una cadena arbitraria, y se proporciona específicamente "testing123" como ejemplo.
skomisa
1
El uso de la ayuda de varios pueblos de varios subprocesos.
Sé que esto ha sido respondido, pero me gustaría dar un método de codificación y descodificación completo para cualquier otro en mi misma situación.
Aquí están mis métodos de codificación y decodificación ...
// 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;}
Aquí hay algunos puntos de referencia que comparan diferentes enfoques y bibliotecas. Guava supera a Apache Commons Codec en decodificación. Commons Codec supera a Guava en codificación. Y JHex los supera tanto en decodificación como en codificación.
Todo está en un archivo de clase única para JHex . Siéntase libre de copiar y pegar si no desea otra biblioteca en su árbol de dependencias. También tenga en cuenta que solo está disponible como jar de Java 9 hasta que pueda descubrir cómo publicar múltiples destinos de lanzamiento con Gradle y el complemento Bintray.
Una forma breve y conveniente de convertir una cadena a su notación hexadecimal es:
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());}
Respuestas:
Aquí hay una forma corta de convertirlo a hexadecimal:
fuente
BigInteger(int,byte[])
constructor; de lo contrario, si el primer byte es negativo, obtendrá un BigInteger negativo.Para asegurarse de que el hexadecimal siempre tenga 40 caracteres, BigInteger debe ser positivo:
fuente
byte[] data = { -1, 1 };
código de prueba en esta respuesta funciona bien, mientras que el código de 17 votos a favor falla.-1
de una cadena (como se solicitó en el ejemplo)?byte
s negativos en su matriz.http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html
fuente
Los números que codifique en hexadecimal deben representar alguna codificación de los caracteres, como UTF-8. Entonces, primero convierta la Cadena en un byte [] que representa la cadena en esa codificación, luego convierta cada byte en hexadecimal.
fuente
Utilizar
DatatypeConverter.printHexBinary()
:Uso de ejemplo:
Huellas dactilares:
Nota : Esto causa un pequeño problema adicional
Java 9
y más nuevo, ya que la API no está incluida de forma predeterminada. Para referencia, por ejemplo, consulte esteGitHub
número.fuente
Aqui otra solucion
fuente
format("%02x")
así que format () siempre usa 2 caracteres. A pesar de que ASCII es hexagonal de dos dígitos es decir, A = 0x65Todas las respuestas basadas en String.getBytes () implican codificar su cadena de acuerdo con un Charset. No necesariamente obtener el valor hexadecimal de los 2 bytes caracteres que componen su cadena. Si lo que realmente desea es el equivalente a un visor hexadecimal, debe acceder a los caracteres directamente. Aquí está la función que uso en mi código para depurar problemas de Unicode:
Entonces, stringToHex ("testing123") le dará:
fuente
Puede regresar
hexString
en este punto, con la advertencia de que los caracteres nulos iniciales se eliminarán y el resultado tendrá una longitud impar si el primer byte es menor que 16. Si necesita manejar esos casos, puede agregar un código adicional rellenar con ceros:fuente
Para obtener el valor entero de hexadecimal
fuente
Convierte una letra en código hexadecimal y código hexadecimal en letra.
fuente
Sugeriría algo como esto, donde
str
está su cadena de entrada:fuente
Primero conviértalo en bytes usando la función getBytes () y luego conviértalo en hexadecimal usando esto:
fuente
Para ir al revés (hexadecimal a cadena), puede usar
fuente
fuente
fuente
Convertir cadena a hexadecimal :
definitivamente esta es la manera fácil.
fuente
El uso de la ayuda de varios pueblos de varios subprocesos.
Sé que esto ha sido respondido, pero me gustaría dar un método de codificación y descodificación completo para cualquier otro en mi misma situación.
Aquí están mis métodos de codificación y decodificación ...
fuente
Mucho mejor:
fuente
Aquí hay algunos puntos de referencia que comparan diferentes enfoques y bibliotecas. Guava supera a Apache Commons Codec en decodificación. Commons Codec supera a Guava en codificación. Y JHex los supera tanto en decodificación como en codificación.
Ejemplo de JHex
Todo está en un archivo de clase única para JHex . Siéntase libre de copiar y pegar si no desea otra biblioteca en su árbol de dependencias. También tenga en cuenta que solo está disponible como jar de Java 9 hasta que pueda descubrir cómo publicar múltiples destinos de lanzamiento con Gradle y el complemento Bintray.
fuente
Una forma breve y conveniente de convertir una cadena a su notación hexadecimal es:
fuente
verifique esta solución para String to hex y hex to String vise-versa
Salida como sigue:
fuente