Een string omzetten naar hexadecimaal in Java

Ik probeer een string als “testen123” in hexadecimale vorm in Java te converteren. Ik gebruik momenteel bluej.

en om het terug te zetten, is het hetzelfde, behalve achteruit?


1, Autoriteit 100%

Hier is een korte manier om het naar HEX te converteren:

public String toHex(String arg) {
    return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}

2, Autoriteit 30%

Om ervoor te zorgen dat de HEX altijd 40 tekens lang is, moet de Biginteger positief zijn:

public String toHex(String arg) {
  return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}

3, Autoriteit 24%

import org.apache.commons.codec.binary.Hex;
...
String hexString = Hex.encodeHexString(myString.getBytes(/* charset */));

http://commons.apache.org/codec/apidocs /org/apache/commons/codec/binary/hex.html


4, Autoriteit 10%

De cijfers die u in het hexadecimaal codeert, moeten een aantal codering van de tekens vertegenwoordigen, zoals UTF-8. Dus converteer eerst de tekenreeks naar een byte [] die de tekenreeks weergeeft in die codering en converteer vervolgens elke byte naar hexadecimaal.

public static String hexadecimal(String input, String charsetName) throws UnsupportedEncodingException {
    if (input == null) throw new NullPointerException();
    return asHex(input.getBytes(charsetName));
}
private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray();
public static String asHex(byte[] buf)
{
    char[] chars = new char[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];
    }
    return new String(chars);
}

Antwoord 5, autoriteit 9%

Gebruik DatatypeConverter.printHexBinary():

public static String toHexadecimal(String text) throws UnsupportedEncodingException
{
    byte[] myBytes = text.getBytes("UTF-8");
    return DatatypeConverter.printHexBinary(myBytes);
}

Voorbeeld van gebruik:

System.out.println(toHexadecimal("Hello StackOverflow"));

Afdrukken:

48656C6C6F20537461636B4F766572666C6F77

Opmerking: dit veroorzaakt wat extra problemen met Java 9en nieuwer, aangezien de API niet standaard is inbegrepen. Voor referentie b.v. zie ditGitHub-probleem.


Antwoord 6, autoriteit 5%

Hier een andere oplossing

public static String toHexString(byte[] ba) {
    StringBuilder str = new StringBuilder();
    for(int i = 0; i < ba.length; i++)
        str.append(String.format("%x", ba[i]));
    return str.toString();
}
public static String fromHexString(String hex) {
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < hex.length(); i+=2) {
        str.append((char) Integer.parseInt(hex.substring(i, i + 2), 16));
    }
    return str.toString();
}

Antwoord 7, autoriteit 3%

Alle antwoorden op basis van String.getBytes() hebben betrekking op het coderenvan uw tekenreeks volgens een tekenset. U krijgt niet per se de hexadecimale waarde van de 2-byte tekenswaaruit uw tekenreeks bestaat. Als wat je eigenlijk wilt het equivalent is van een hex-viewer, dan moet je rechtstreeks toegang krijgen tot de tekens. Dit is de functie die ik in mijn code gebruik voor het debuggen van Unicode-problemen:

static String stringToHex(String string) {
  StringBuilder buf = new StringBuilder(200);
  for (char ch: string.toCharArray()) {
    if (buf.length() > 0)
      buf.append(' ');
    buf.append(String.format("%04x", (int) ch));
  }
  return buf.toString();
}

Vervolgens geeft stringToHex(“testing123”) u:

0074 0065 0073 0074 0069 006e 0067 0031 0032 0033

Antwoord 8, autoriteit 2%

Om de gehele waarde van hex te krijgen

       //hex like: 0xfff7931e to int
        int hexInt = Long.decode(hexString).intValue();

9, Autoriteit 2%

Converteer een letter in de Hex-code en de HEX-code in de letter.

       String letter = "a";
    String code;
    int decimal;
    code = Integer.toHexString(letter.charAt(0));
    decimal = Integer.parseInt(code, 16);
    System.out.println("Hex code to " + letter + " = " + code);
    System.out.println("Char to " + code + " = " + (char) decimal);

10, Autoriteit 2%

Ik zou zoiets voorstellen, waar stris uw invoerreeks:

StringBuffer hex = new StringBuffer();
char[] raw = tokens[0].toCharArray();
for (int i=0;i<raw.length;i++) {
    if     (raw[i]<=0x000F) { hex.append("000"); }
    else if(raw[i]<=0x00FF) { hex.append("00" ); }
    else if(raw[i]<=0x0FFF) { hex.append("0"  ); }
    hex.append(Integer.toHexString(raw[i]).toUpperCase());
}

11

Om de andere kant op te gaan (HEX to String), kunt u

gebruiken

public String hexToString(String hex) {
    return new String(new BigInteger(hex, 16).toByteArray());
}

12

Converteer het eerst naar bytes met de functie getBytes() en converteer het vervolgens naar hex usign this :

private static String hex(byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for (int i=0; i<bytes.length; i++) {
        sb.append(String.format("%02X ",bytes[i]));
    }
    return sb.toString();
}

Antwoord 13

De hulp van meerdere mensen gebruiken uit meerdere threads..

Ik weet dat dit is beantwoord, maar ik zou graag een volledige codering & decodeermethode voor anderen in dezelfde situatie..

Hier is mijn codering & Decoderingsmethoden..

// Global Charset Encoding
public static Charset encodingType = StandardCharsets.UTF_8;
// Text To Hex
public static String textToHex(String text)
{
    byte[] buf = null;
    buf = text.getBytes(encodingType);
    char[] HEX_CHARS = "0123456789abcdef".toCharArray();
    char[] chars = new char[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];
    }
    return new String(chars);
}
// Hex To Text
public static String hexToText(String hex)
{
    int l = hex.length();
    byte[] data = new byte[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 = new String(data, encodingType);
    return st;
}

Antwoord 14

Tekenreeks converteren naar hexadecimaal:

public String hexToString(String hex) {
    return Integer.toHexString(Integer.parseInt(hex));
}

Absoluut dit is de gemakkelijke manier.


15

Veel beter:

public static String fromHexString(String hex, String sourceEncoding ) throws  IOException{
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    byte[] buffer = new byte[512];
    int _start=0;
    for (int i = 0; i < hex.length(); i+=2) {
        buffer[_start++] = (byte)Integer.parseInt(hex.substring(i, i + 2), 16);
        if (_start >=buffer.length || i+2>=hex.length()) {
            bout.write(buffer);
            Arrays.fill(buffer, 0, buffer.length, (byte)0);
            _start  = 0;
        }
    }
    return  new String(bout.toByteArray(), sourceEncoding);
}

16

import java.io.*;
import java.util.*;
public class Exer5{
    public String ConvertToHexadecimal(int num){
        int r;
        String bin="\0";
        do{
            r=num%16;
            num=num/16;
            if(r==10)
            bin="A"+bin;
            else if(r==11)
            bin="B"+bin;
            else if(r==12)
            bin="C"+bin;
            else if(r==13)
            bin="D"+bin;
            else if(r==14)
            bin="E"+bin;
            else if(r==15)
            bin="F"+bin;
            else
            bin=r+bin;
        }while(num!=0);
        return bin;
    }
    public int ConvertFromHexadecimalToDecimal(String num){
        int a;
        int ctr=0;
        double prod=0;
        for(int i=num.length(); i>0; i--){
            if(num.charAt(i-1)=='a'||num.charAt(i-1)=='A')
            a=10;
            else if(num.charAt(i-1)=='b'||num.charAt(i-1)=='B')
            a=11;
            else if(num.charAt(i-1)=='c'||num.charAt(i-1)=='C')
            a=12;
            else if(num.charAt(i-1)=='d'||num.charAt(i-1)=='D')
            a=13;
            else if(num.charAt(i-1)=='e'||num.charAt(i-1)=='E')
            a=14;
            else if(num.charAt(i-1)=='f'||num.charAt(i-1)=='F')
            a=15;
            else
            a=Character.getNumericValue(num.charAt(i-1));
            prod=prod+(a*Math.pow(16, ctr));
            ctr++;
        }
        return (int)prod;
    }
    public static void main(String[] args){
        Exer5 dh=new Exer5();
        Scanner s=new Scanner(System.in);
        int num;
        String numS;
        int choice;
        System.out.println("Enter your desired choice:");
        System.out.println("1 - DECIMAL TO HEXADECIMAL             ");
        System.out.println("2 - HEXADECIMAL TO DECIMAL              ");
        System.out.println("0 - EXIT                          ");
        do{
            System.out.print("\nEnter Choice: ");
            choice=s.nextInt();
            if(choice==1){
                System.out.println("Enter decimal number: ");
                num=s.nextInt();
                System.out.println(dh.ConvertToHexadecimal(num));
            }
            else if(choice==2){
                System.out.println("Enter hexadecimal number: ");
                numS=s.next();
                System.out.println(dh.ConvertFromHexadecimalToDecimal(numS));
            }
        }while(choice!=0);
    }
}

Antwoord 17

new BigInteger(1, myString.getBytes(/*YOUR_CHARSET?*/)).toString(16)

Antwoord 18

Hier zijn enkele benchmarksdie verschillende benaderingen en bibliotheken vergelijken. Guava verslaat Apache Commons Codec bij het decoderen. Commons Codec verslaat Guava bij codering. En JHex verslaat ze zowel qua decoderen als coderen.

JHex-voorbeeld

String hexString = "596f752772652077656c636f6d652e";
byte[] decoded = JHex.decodeChecked(hexString);
System.out.println(new String(decoded));
String reEncoded = JHex.encode(decoded);

Alles staat in een enkel klassebestand voor JHex. Voel je vrij om te kopiëren en plakken als je niet nog een bibliotheek in je afhankelijkheidsstructuur wilt. Merk ook op dat het alleen beschikbaar is als Java 9-jar totdat ik erachter kan komen hoe ik meerdere releasedoelen kan publiceren met Gradle en de Bintray-plug-in.


Antwoord 19

controleer deze oplossing voor String naar hex en hex naar String vice versa

public class TestHexConversion {
public static void main(String[] args) {
    try{
        String clearText = "testString For;0181;with.love";
        System.out.println("Clear Text  = " + clearText);
        char[] chars = clearText.toCharArray();
        StringBuffer hex = new StringBuffer();
        for (int i = 0; i < chars.length; i++) {
            hex.append(Integer.toHexString((int) chars[i]));
        }
        String hexText = hex.toString();
        System.out.println("Hex Text  = " + hexText);
        String decodedText = HexToString(hexText);
        System.out.println("Decoded Text = "+decodedText);
    } catch (Exception e){
        e.printStackTrace();
    }
}
public static String HexToString(String hex){
      StringBuilder finalString = new StringBuilder();
      StringBuilder tempString = new StringBuilder();
      for( int i=0; i<hex.length()-1; i+=2 ){
          String output = hex.substring(i, (i + 2));
          int decimal = Integer.parseInt(output, 16);
          finalString.append((char)decimal);
          tempString.append(decimal);
      }
    return finalString.toString();
}

Uitvoer als volgt:

Duidelijke tekst = teststring voor; 0181; met.Love

HEX TEXT = 74657374537472696E6720466F723B303138313B776974682E6C6F7665

Tekst gedecodeerde tekst = teststring voor; 0181; met.Love


20

Een korte en handige manier om een ​​tekenreeks te converteren naar zijn hexadecimale notatie is:

public static void main(String... args){
String str = "Hello! This is test string.";
char ch[] = str.toCharArray();
StringBuilder sb = new StringBuilder();
    for (int i = 0; i < ch.length; i++) {
        sb.append(Integer.toHexString((int) ch[i]));
    }
    System.out.println(sb.toString());
}

Other episodes