有没有更简单的方法来实现这个?或JDK或其他lib中实现的方法?
/**
* Convert a byte array to 2-byte-size hexadecimal String.
*/
public static String to2DigitsHex(byte[] bytes) {
String hexData = "";
for (int i = 0; i < bytes.length; i++) {
int intV = bytes[i] & 0xFF; // positive int
String hexV = Integer.toHexString(intV);
if (hexV.length() < 2) {
hexV = "0" + hexV;
}
hexData += hexV;
}
return hexData;
}
public static void main(String[] args) {
System.out.println(to2DigitsHex(new byte[] {8, 10, 12}));
}
输出为:“08 0A 0C”(没有空格)
答案 0 :(得分:7)
至少使用StringBuilder#append()
代替stringA += stringB
来提高性能并节省内存。
public static String binaryToHexString(byte[] bytes) {
StringBuilder hex = new StringBuilder(bytes.length * 2);
for (byte b : bytes) {
int i = (b & 0xFF);
if (i < 0x10) hex.append('0');
hex.append(Integer.toHexString(i));
}
return hex.toString();
}
答案 1 :(得分:6)
Apache Commons-Codec有Hex类,可以满足您的需求:
String hexString = Hex.encodeHexString(bytes);
到目前为止最简单的方法。不要乱用二元运算符,使用库来做脏工作=)
答案 2 :(得分:1)
public static String to2DigitsHex(final byte[] bytes) {
final StringBuilder accum = new StringBuilder(bytes.length * 2);
for (byte b : bytes) {
b &= 0xff;
if (b < 16) accum.append("0");
accum.append(Integer.toHexString(b);
}
return accum.toString();
}
如果要对此例程进行大量调用,最好使用自己的StringBuilder
。
答案 3 :(得分:1)
您可以使用BigInteger。
示例:
(new BigInteger(1,bytes)).toString(16)
您需要在开头添加“0”。
更优雅的解决方案(取自here)是:
BigInteger i = new BigInteger(1,bytes);
System.out.println(String.format("%1$06X", i));
您需要事先知道字节数才能使用正确的格式化程序。
答案 4 :(得分:1)
private static String to2DigitsHex(byte[] bs) {
String s = new BigInteger(bs).toString(16);
return s.length()%2==0? s : "0"+s;
}
答案 5 :(得分:0)
我对此实现没有任何赞赏,因为我将其视为类似讨论的一部分,并认为这是一个优雅的解决方案:
private static final String HEXES = "0123456789ABCDEF"; public String toHexString(byte[] bytes) { final StringBuilder hex = new StringBuilder(2 * bytes.length); for (final byte b : _bytes) { hex.append(HEXES.charAt((b & 0xF0) >> 4)) .append(HEXES.charAt((b & 0x0F))); } return hex.toString(); }