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

Java 有没有更简单的方法将字节数组转换为2字节大小的十六进制字符串?,java,bytearray,hex,Java,Bytearray,Hex,有没有更简单的方法来实现这一点?还是在JDK或其他库中实现的方法 /** * 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;

有没有更简单的方法来实现这一点?还是在JDK或其他库中实现的方法

/**
 * 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}));
}
/**
*将字节数组转换为2字节大小的十六进制字符串。
*/
公共静态字符串到2DigitsHex(字节[]字节){
字符串hexData=“”;
for(int i=0;i
输出为:“08 0A 0C”(不带空格)

至少使用而不是
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();
}
公共静态字符串binaryToHexString(字节[]字节){
StringBuilder十六进制=新的StringBuilder(bytes.length*2);
for(字节b:字节){
inti=(b&0xFF);
如果(i<0x10)十六进制追加('0');
hex.append(Integer.toHexString(i));
}
返回hex.toString();
}
至少使用而不是
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();
}
公共静态字符串binaryToHexString(字节[]字节){
StringBuilder十六进制=新的StringBuilder(bytes.length*2);
for(字节b:字节){
inti=(b&0xFF);
如果(i<0x10)十六进制追加('0');
hex.append(Integer.toHexString(i));
}
返回hex.toString();
}
有一个类,它将执行您需要的操作:

String hexString = Hex.encodeHexString(bytes);
到目前为止,这是最简单的方法。不要弄乱二进制运算符,使用库来执行脏工作=)

有类,它将执行您需要的操作:

String hexString = Hex.encodeHexString(bytes);
到目前为止,这是最简单的方法。不要弄乱二进制运算符,使用库执行脏工作=)

公共静态字符串到2DigitsHex(最终字节[]字节){
最终StringBuilder accum=新的StringBuilder(bytes.length*2);
for(字节b:字节){
b&=0xff;
如果(b<16)累计附加(“0”);
累计追加(整数)到十六进制字符串(b);
}
返回累计到字符串();
}
如果要大量调用此例程,最好使用自己的显式
StringBuilder

公共静态字符串到2digitshex(最终字节[]字节){
最终StringBuilder accum=新的StringBuilder(bytes.length*2);
for(字节b:字节){
b&=0xff;
如果(b<16)累计附加(“0”);
累计追加(整数)到十六进制字符串(b);
}
返回累计到字符串();
}
如果这个例程需要大量调用,最好使用自己的显式
StringBuilder

您可以使用它

例如:

(new BigInteger(1,bytes)).toString(16)
您需要在开头添加一个“0”

更优雅的解决方案(取自)是:

为了使用正确的格式化程序,您需要提前知道字节数。

您可以使用它

 private static String to2DigitsHex(byte[] bs) {
      String s = new BigInteger(bs).toString(16);
      return s.length()%2==0? s : "0"+s;
 }
例如:

(new BigInteger(1,bytes)).toString(16)
您需要在开头添加一个“0”

更优雅的解决方案(取自)是:


为了使用正确的格式化程序,您需要提前知道字节数。

我不认为这一实现有什么好处,因为我将其视为类似讨论的一部分,并认为这是一个优雅的解决方案:

 private static String to2DigitsHex(byte[] bs) {
      String s = new BigInteger(bs).toString(16);
      return s.length()%2==0? s : "0"+s;
 }
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(); } 私有静态最终字符串HEXES=“0123456789ABCDEF”; 公共字符串到十六进制字符串(字节[]字节){ 最终StringBuilder十六进制=新的StringBuilder(2*bytes.length); for(最终字节b:_字节){ 十六进制追加(十六进制字符((b&0xF0)>>4)) .append(十六进制字符((b&0x0F)); } 返回hex.toString(); }
我不认为这一实现有任何好处,因为我将其视为类似讨论的一部分,并认为这是一个优雅的解决方案:

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(); } 私有静态最终字符串HEXES=“0123456789ABCDEF”; 公共字符串到十六进制字符串(字节[]字节){ 最终StringBuilder十六进制=新的StringBuilder(2*bytes.length); for(最终字节b:_字节){ 十六进制追加(十六进制字符((b&0xF0)>>4)) .append(十六进制字符((b&0x0F)); } 返回hex.toString(); }
是不是应该是
080a0c
?@Toon:没有最后的3(打字?),是的。很明显,我应该花更多的时间回答问题,而不是花更少的时间做出明显的评论(有打字错误,不是更少)或者我可以说BalusC对一个普通人来说太快了。是的。它不应该是
080a0c
?@Toon:没有结尾的3(打字?),是的。显然,我应该花更多的时间回答问题,少花时间做明显的评论(有打字错误,没有更少)。或者我可以说BalusC对于一个人来说太快了。是的。这确实是一个很好的单行(+1),但我以前分析过它,它比较慢,而且最重要的是,它不在字节<0x10之前加零。只有第一个零不会加前缀。例如{8,10,12}将转换为80a0c。我已经成功地将其用于生成MD5哈希。我不能说任何关于性能的内容。这确实是一个很好的单行(+1),但我以前对它进行过分析,它相对较慢,而且最重要的是,它不会在字节<0x10之前加零。只有第一个零不会加前缀。例如{8,10,12}将转换为80a0c。我已成功地将其用于生成MD5哈希。我不能对性能做任何说明。恕我直言,仍然必须将字节变量b强制转换为int,否则将为负字节值触发b<0x10,结果将被破坏。int n=b&0xFF;if(n<0x10)将解决该问题。恕我直言,仍然必须将字节变量b强制转换为int,否则将为负字节值触发b<0x10,结果将被破坏。int n=b&0xFF;if(n<0x10)将解决该问题。