在Java中将string转换为hex

我想在java中将“testing123”这样的string转换为hex格式。 我目前正在使用BlueJ。

而将其转换回去,除了向后是同样的东西吗?

以下是将其转换为hex的简短方法:

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

要确保hex总是40个字符长,BigInteger必须是正面的:

 public String toHex(String arg) { return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/))); } 
 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

您编码为hex的数字必须表示字符的某种编码,例如UTF-8。 因此,首先将string转换为表示该编码中string的byte [],然后将每个字节转换为hex。

 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); } 

使用DatatypeConverter.printHexBinary()

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

用法示例:

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

打印:

 48656C6C6F20537461636B4F766572666C6F77 

这里有其他解决scheme

 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(); } 

所有基于String.getBytes()的答案都涉及到根据一个字符集来编码你的string。 您不一定会获得组成string的2字节字符的hex值。 如果你真正想要的是相当于一个hex查看器,那么你需要直接访问字符。 以下是我在代码中用于debuggingUnicode问题的函数:

 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(); } 

然后,stringToHex(“testing123”)会给你:

 0074 0065 0073 0074 0069 006e 0067 0031 0032 0033 

我会build议这样的,其中str是你的inputstring:

 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()); } 

获取hex的整数值

  //hex like: 0xfff7931e to int int hexInt = Long.decode(hexString).intValue(); 
 byte[] bytes = string.getBytes(CHARSET); // you didn't say what charset you wanted BigInteger bigInt = new BigInteger(bytes); String hexString = bigInt.toString(16); // 16 is the radix 

你可以在这个时候返回hexString ,注意hexString空字符将被删除,如果第一个字节小于16,结果将有一个奇数的长度。如果你需要处理这些情况,你可以添加一些额外的代码填充0:

 StringBuilder sb = new StringBuilder(); while ((sb.length() + hexString.length()) < (2 * bytes.length)) { sb.append("0"); } sb.append(hexString); return sb.toString(); 

以hex代码和hex代码字母转换字母。

  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); 

首先使用getBytes()函数将其转换为字节,然后将其转换为hex使用此:

 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(); } 
 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); } } 

去其他方式(hexstring),你可以使用

 public String hexToString(String hex) { return new String(new BigInteger(hex, 16).toByteArray()); } 
 new BigInteger(1, myString.getBytes(/*YOUR_CHARSET?*/)).toString(16) 

将string转换为hex

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

这绝对是一个简单的方法。

好多了:

 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); } 

以下是比较不同方法和库的一些基准 。 番石榴在解码时击败了Apache Commons编解码器。 Commons Codec在编码方面击败了Guava。 而JHex在解码和编码方面都胜过它们。

JHex的例子

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

一切都在JHex的单个类文件中 。 如果您不想在依赖关系树中添加另一个库,请随意复制粘贴。 还要注意,它只能作为Java 9的jar版本,直到我可以找出如何使用Gradle和Bintray插件发布多个版本目标。