有没有更简单的方法将字节数组转换为2字节大小的十六进制字符串?

时间:2010-04-15 14:05:58

标签: java bytearray hex

有没有更简单的方法来实现这个?或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”(没有空格)

6 个答案:

答案 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-CodecHex类,可以满足您的需求:

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