我正在尝试将类似于"testing123"的字符串在Java中转换为十六进制形式。我目前使用的是BlueJ。
将其转换回来是否也是一样的,只不过是反向操作?
这是一个简单的将其转换为十六进制的方法:
public String toHex(String arg) {
return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
public String toHex(String arg) {
return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
byte[] data = { -1, 1 };
-- 这个答案中的代码可以正常工作,而那个得到17个赞的则失败了。 - hudolejevimport 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
使用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
注意:这个操作在Java 9及更高版本中会导致一些额外的麻烦,因为API默认不包含在内。例如,请参见这个GitHub
问题。
你将数字编码为十六进制,必须表示某些字符的编码方式,例如UTF-8。因此,首先将字符串转换为byte [],表示该编码中的字符串,然后将每个字节转换为十六进制。
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);
}
这里有另外一种解决方案
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();
}
format(“%02x”)
,这样format()始终使用2个字符。即使ASCII是双位十六进制,即A = 0x65。 - mike jones所有基于String.getBytes()的答案都涉及根据Charset对您的字符串进行编码。您不一定会得到组成字符串的2字节字符的十六进制值。如果您真正想要的是十六进制查看器的等价物,则需要直接访问字符。以下是我在调试Unicode问题时在我的代码中使用的函数:
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
str
是您的输入字符串: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());
}
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
,但请注意,如果第一个字节小于16,则会去掉前导空字符并且结果长度为奇数。如果你需要处理这些情况,你可以添加一些额外的代码来用0填充:
StringBuilder sb = new StringBuilder();
while ((sb.length() + hexString.length()) < (2 * bytes.length)) {
sb.append("0");
}
sb.append(hexString);
return sb.toString();
BigInteger(int,byte[])
构造函数;否则,如果第一个字节为负数,则会得到一个负的 BigInteger。 - Joni