Cette méthode est en fait la bonne. Essayez byte[] data = { -1, 1 };- le code dans cette réponse fonctionne bien, alors que celui avec 17 votes positifs échoue.
hudolejev
1
Est-il possible d'obtenir un octet avec une valeur -1dans une chaîne (comme cela a été demandé dans l'exemple)?
Kaleb Pederson le
@KalebPederson Oui. Ce n'est même pas très dur. . Si votre choix encodage jamais utilise le bit le plus important de tout caractère ( par exemple, comme UTF- * faire), vous avez négatif bytes dans votre tableau.
Intéressant, si vous ne voulez pas réinventer la roue.
Federico Zancan
3
@MelNicholson il y a une fonction decodeHex dans Hex pour aller à un octet []. Vous devez l'utiliser car rien ne garantit qu'une chaîne HEX aléatoire puisse être convertie en une chaîne dans votre encodage.
BxlSofty
18
Les nombres que vous encodez en hexadécimal doivent représenter un certain encodage des caractères, tel que UTF-8. Commencez par convertir la chaîne en un octet [] représentant la chaîne dans ce codage, puis convertissez chaque octet en hexadécimal.
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);}
C'est une solution intéressante et qui frappe au cœur de la représentation numérique des données. Pourriez-vous s'il vous plaît expliquer ce que vous faites, et ce que représentent les «nombres magiques» dans votre solution? Un nouveau venu peut ne pas savoir ce que signifie l'opérateur >>>, pourquoi nous utilisons les bits et & avec un masque de 0xF0, ou pourquoi le tableau chars est de taille [2 * buf.length].
Remarque : cela pose un petit problème supplémentaire avec Java 9et plus récent car l'API n'est pas incluse par défaut. Pour référence, par exemple, consultez ceGitHub numéro.
Bien mais j'utiliserais format("%02x")donc format () utilise toujours 2 caractères. Même si ASCII est hexadécimal à deux chiffres, c'est-à-dire A = 0x65
Mike
8
Toutes les réponses basées sur String.getBytes () impliquent l' encodage de votre chaîne selon un Charset. Vous ne recevez pas nécessairement la valeur hexadécimale des 2 octets caractères qui composent votre chaîne. Si ce que vous voulez réellement est l'équivalent d'un visualiseur hexadécimal, vous devez accéder directement aux caractères. Voici la fonction que j'utilise dans mon code pour déboguer les problèmes Unicode:
C'est bien si vous voulez voir la représentation interne des caractères Java, qui est UTF-16, une représentation spécifique d'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
Vous pouvez revenir hexStringà ce stade, avec la mise en garde que les caractères NULL de début seront supprimés, et le résultat aura une longueur impaire si le premier octet est inférieur à 16. Si vous devez gérer ces cas, vous pouvez ajouter du code supplémentaire pour compléter avec des 0:
Merci pour la correction, Software Monkey. J'étais assez fatigué quand j'ai écrit la réponse, et mon test pour «raw [i] <= 9» est clairement insuffisant.
rodion
1
Cela fonctionne vraiment bien, y a-t-il un moyen d'inverser à nouveau l'hexagone généré en chaîne?
1
Où est str ici?
Viswanath Lekshmanan
3
Convertissez-le d'abord en octets en utilisant la fonction getBytes (), puis convertissez-le en hexadécimal en utilisant ceci:
Ce n'est pas une solution. La question est de savoir comment obtenir la représentation hexadécimale du contenu d'une chaîne arbitraire, et a spécifiquement fourni "testing123" comme exemple.
skomisa
1
Utilisation de l'aide de plusieurs personnes à partir de plusieurs threads.
Je sais que cela a été répondu, mais je voudrais donner une méthode complète d'encodage et de décodage pour tous les autres dans la même situation.
Voici mes méthodes d'encodage et de décodage.
// 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;}
Voici quelques points de repère comparant différentes approches et bibliothèques. Guava bat le codec Apache Commons au décodage. Le codec Commons bat Guava lors de l'encodage. Et JHex les bat à la fois pour le décodage et l'encodage.
Tout est dans un fichier de classe unique pour JHex . N'hésitez pas à copier-coller si vous ne souhaitez pas encore une autre bibliothèque dans votre arborescence de dépendances. Notez également qu'il n'est disponible qu'en tant que jar Java 9 jusqu'à ce que je sache comment publier plusieurs cibles de publication avec Gradle et le plugin Bintray.
Un moyen court et pratique de convertir une chaîne en sa notation hexadécimale est:
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());}
Réponses:
Voici un court moyen de le convertir en hexadécimal:
la source
BigInteger(int,byte[])
constructeur; sinon, si le premier octet est négatif, vous obtenez un BigInteger négatif.Pour garantir que l'hexagone comporte toujours 40 caractères, le BigInteger doit être positif:
la source
byte[] data = { -1, 1 };
- le code dans cette réponse fonctionne bien, alors que celui avec 17 votes positifs échoue.-1
dans une chaîne (comme cela a été demandé dans l'exemple)?byte
s dans votre tableau.http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html
la source
Les nombres que vous encodez en hexadécimal doivent représenter un certain encodage des caractères, tel que UTF-8. Commencez par convertir la chaîne en un octet [] représentant la chaîne dans ce codage, puis convertissez chaque octet en hexadécimal.
la source
Utilisez
DatatypeConverter.printHexBinary()
:Exemple d'utilisation:
Impressions:
Remarque : cela pose un petit problème supplémentaire avec
Java 9
et plus récent car l'API n'est pas incluse par défaut. Pour référence, par exemple, consultez ceGitHub
numéro.la source
Voici une autre solution
la source
format("%02x")
donc format () utilise toujours 2 caractères. Même si ASCII est hexadécimal à deux chiffres, c'est-à-dire A = 0x65Toutes les réponses basées sur String.getBytes () impliquent l' encodage de votre chaîne selon un Charset. Vous ne recevez pas nécessairement la valeur hexadécimale des 2 octets caractères qui composent votre chaîne. Si ce que vous voulez réellement est l'équivalent d'un visualiseur hexadécimal, vous devez accéder directement aux caractères. Voici la fonction que j'utilise dans mon code pour déboguer les problèmes Unicode:
Ensuite, stringToHex ("testing123") vous donnera:
la source
Vous pouvez revenir
hexString
à ce stade, avec la mise en garde que les caractères NULL de début seront supprimés, et le résultat aura une longueur impaire si le premier octet est inférieur à 16. Si vous devez gérer ces cas, vous pouvez ajouter du code supplémentaire pour compléter avec des 0:la source
Pour obtenir la valeur Integer de hex
la source
Convertissez une lettre en code hexadécimal et un code hexadécimal en lettre.
la source
Je suggérerais quelque chose comme ceci, où se
str
trouve votre chaîne d'entrée:la source
Convertissez-le d'abord en octets en utilisant la fonction getBytes (), puis convertissez-le en hexadécimal en utilisant ceci:
la source
Pour aller dans l'autre sens (hex à chaîne), vous pouvez utiliser
la source
la source
la source
Convertir la chaîne en hexadécimal :
c'est certainement le moyen le plus simple.
la source
Utilisation de l'aide de plusieurs personnes à partir de plusieurs threads.
Je sais que cela a été répondu, mais je voudrais donner une méthode complète d'encodage et de décodage pour tous les autres dans la même situation.
Voici mes méthodes d'encodage et de décodage.
la source
Bien mieux:
la source
Voici quelques points de repère comparant différentes approches et bibliothèques. Guava bat le codec Apache Commons au décodage. Le codec Commons bat Guava lors de l'encodage. Et JHex les bat à la fois pour le décodage et l'encodage.
Exemple JHex
Tout est dans un fichier de classe unique pour JHex . N'hésitez pas à copier-coller si vous ne souhaitez pas encore une autre bibliothèque dans votre arborescence de dépendances. Notez également qu'il n'est disponible qu'en tant que jar Java 9 jusqu'à ce que je sache comment publier plusieurs cibles de publication avec Gradle et le plugin Bintray.
la source
Un moyen court et pratique de convertir une chaîne en sa notation hexadécimale est:
la source
vérifiez cette solution pour String to hex et hex to String vice-versa
Sortie comme suit:
la source