风也温柔

计算机科学知识库

java 16进制字符串转换 如何在Java中将字节数组转换为十六进制字符串?

  我有一个用十六进制数字填充并打印的字节数组,简单的方法是毫无意义的java 16进制字符串转换,因为有许多不可打印的元素。 我需要的是以下形式的确切十六进制代码:

  #1楼

  最简单的解决方案,没有外部库,没有数字常量:

   public static String byteArrayTo[Hex]6 {

       StringBuilder sb = new StringBuilder(a.length * 2);
       for(byte b: a)
          sb.append(String.format("x", b));
       return sb.toString();
    }

  #2楼

  这个简单的对我有用

   = new (1, ).(16);

  编辑-使用此方法将删除前导零,但是嘿在我的用例中工作过。 感谢@Voicu指出

  #3楼

  //移位字节更有效//您也可以使用此字节

   public static String getHexString (String s)

    {
        byte[] buf = s.getBytes();
        StringBuffer sb = new StringBuffer();
        for (byte b:buf)
        {
            sb.append(String.format("%x", b));
        }
            return sb.toString();
    }

  #4楼

  以少量的存储查找表的代价,该实现简单且非常快速。

   private static final char[] BYTE2HEX=(

        "000102030405060708090A0B0C0D0E0F"+
        "101112131415161718191A1B1C1D1E1F"+
        "202122232425262728292A2B2C2D2E2F"+
        "303132333435363738393A3B3C3D3E3F"+
        "404142434445464748494A4B4C4D4E4F"+
        "505152535455565758595A5B5C5D5E5F"+
        "606162636465666768696A6B6C6D6E6F"+
        "707172737475767778797A7B7C7D7E7F"+
        "808182838485868788898A8B8C8D8E8F"+
        "909192939495969798999A9B9C9D9E9F"+
        "A0A1A2A3A4A5A6A7A8A9AAABACADAEAF"+
        "B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"+
        "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"+
        "D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"+
        "E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF"+
        "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF").toCharArray();
       ; 
      public static String getHexString(byte[] bytes) {
        final int len=bytes.length;
        final char[] chars=new char[len 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }

  它稍微适应了接受的答案。 就我个人而言,我保留了已接受的答案和此重载以及更多的答案,可在更多情况下使用。

  #8楼

  @n提出的解决方案的一个小变形,它使您可以在输出十六进制字符串中将N个字节可视地捆绑在一起:

   final static char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();

     final static char BUNDLE_SEP = ' ';
    public static String bytesToHexString(byte[] bytes, int bundleSize /*[bytes]*/]) {
            char[] hexChars = new char[(bytes.length * 2) + (bytes.length / bundleSize)];
            for (int j = 0, k = 1; j < bytes.length; j++, k++) {
                    int v = bytes[j] & 0xFF;
                    int start = (j * 2) + j/bundleSize;
                    hexChars[start] = HEX_ARRAY[v >>> 4];
                    hexChars[start + 1] = HEX_ARRAY[v & 0x0F];
                    if ((k % bundleSize) == 0) {
                            hexChars[start + 2] = BUNDLE_SEP;
                    }   
            }   
            return new String(hexChars).trim();    
    }

  那是:

   bytesToHexString("..DOOM..".toCharArray().getBytes(), 2);

    2E2E 444F 4F4D 2E2E
    bytesToHexString("..DOOM..".toCharArray().getBytes(), 4);
    2E2E444F 4F4D2E2E

  #9楼

  这个怎么样?

   String byteToHex(final byte[] hash)

        {
            Formatter formatter = new Formatter();
            for (byte b : hash)
            {
                formatter.format("x", b);
            }
            String result = formatter.toString();
            formatter.close();
            return result;
        }

  #10楼

  如果您正在寻找与完全一样的字节数组,那么我已经将此Java实现转换为。

   class ByteArray:

    @classmethod
    def char(cls, args=[]):
        cls.hexArray = "0123456789ABCDEF".encode(&#39;utf-16&#39;)
        j = 0
        length = (cls.hexArray)
        if j < length:
            v = j & 0xFF
            hexChars = [None, None]
            hexChars[j * 2] = str( cls.hexArray) + str(v)
            hexChars[j * 2 + 1] = str(cls.hexArray) + str(v) + str(0x0F)
            # Use if you want...
            #hexChars.pop()
        return str(hexChars)
    array = ByteArray()
    print array.char(args=[])

  #11楼

  番石榴解决方案,以确保完整性:

  java 16进制字符串转换_java 转换进制_16进制转换10进制

   import com.google.common.io.BaseEncoding;

    ...
    byte[] bytes = "Hello world".getBytes(StandardCharsets.UTF_8);
    final String hex = BaseEncoding.base16().lowerCase().encode(bytes);

  现在, hex是"64" 。

  #12楼

  使用类javax.xml.bind.

   = .(bytes[] raw);

  #13楼

  好的,有很多方法可以做到这一点,但是如果您决定使用一个库,我建议您在项目中仔细研究一下,看看是否已经在已经属于项目的库中实现了某些功能,然后再添加新的库只是为了做到这一点。 例如,如果您还没有

  mons.codec..Hex

  也许你有...

  org...impl.dv.util.

  #14楼

  我会使用类似的方法来固定长度,例如散列:

   md5sum = String.format("2x", new BigInteger(1, md.digest()));

  #15楼

   public static byte[] hexStringToByteArray(String s) {

        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
          data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) 4];
                    value[j++]=toHex[octet&0xF];
                }
                return new String(value);
            }
            static final Encoder LOWER=new Encoder(false);
            static final Encoder UPPER=new Encoder(true);
        }
        public static Encoder getEncoder(){
            return Encoder.LOWER;
        }
        public static Encoder getUpperEncoder(){
            return Encoder.UPPER;
        }
        //...
    }

  #17楼

   private static String bytesToHexString(byte[] bytes, int length) {

            if (bytes == null || length == 0) return null;
            StringBuilder ret = new StringBuilder(2*length);
            for (int i = 0 ; i < length ; i++) {
                int b;
                b = 0x0f & (bytes[i] >> 4);
                ret.append("0123456789abcdef".charAt(b));
                b = 0x0f & bytes[i];
                ret.append("0123456789abcdef".charAt(b));
            }
            return ret.toString();
        }

  java 转换进制_java 16进制字符串转换_16进制转换10进制

  #18楼

  在此页面上找不到无法解决的任何解决方案

  使用循环 使用javax.xml.bind.可以很好地编译,但是经常在运行时抛出java.lang.。

  这是一个没有上述缺陷的解决方案(虽然我的承诺不会有其他缺陷)

   import java.math.BigInteger;

    import static java.lang.System.out;
    public final class App2 {
        // | proposed solution.
        public static String encode(byte[] bytes) {          
            final int length = bytes.length;
            // | BigInteger constructor throws if it is given an empty array.
            if (length == 0) {
                return "00";
            }
            final int evenLength = (int)(2 * Math.ceil(length / 2.0));
            final String format = "%0" + evenLength + "x";         
            final String result = String.format (format, new BigInteger(bytes));
            return result;
        }
        public static void main(String[] args) throws Exception {
            // 00
            out.println(encode(new byte[] {})); 
            // 01
            out.println(encode(new byte[] {1})); 
            //203040
            out.println(encode(new byte[] {0x20, 0x30, 0x40})); 
            // 416c6c20796f75722062617365206172652062656c6f6e6720746f2075732e
            out.println(encode("All your base are belong to us.".getBytes()));
        }
    }   

  我无法在62个操作码下得到此信息,但是如果您可以不使用0填充来防止第一个字节小于0x10,那么以下解决方案将仅使用23个操作码。 确实显示了如果没有本机实现(或者在这种情况下,如果可以在其中以零作为前缀的选项)的话,例如“如果字符串长度为奇数,则用零填充”之类的“易于实现自己”的解决方案会变得非常昂贵。 )。

   public static String encode(byte[] bytes) {

        final int length = bytes.length;
        // | BigInteger constructor throws if it is given an empty array.
        if (length == 0) {
            return "00";
        }
        return new BigInteger(bytes).toString(16);
    }

  #19楼

  我的解决方案基于也许的解决方案,但不依赖于任何额外分配的查找表。 它不使用任何“从字符到字符”的强制转换(实际上, .()做到了,进行一些比较以检查数字的真实含义),因此可能会慢一些。 请随时随地使用它。 干杯。

   public static String bytesToHex(final byte[] bytes)

    {
        final int numBytes = bytes.length;
        final char[] container = new char[numBytes * 2];
        for (int i = 0; i < numBytes; i++)
        {
            final int b = bytes[i] & 0xFF;
            container[i * 2] = Character.forDigit(b >>> 4, 0x10);
            container[i * 2 + 1] = Character.forDigit(b & 0xF, 0x10);
        }
        return new String(container);
    }

  #20楼

  如果您使用的是 框架,则可以使用:

   import org.springframework.security.crypto.codec.Hex

    final String testString = "Test String";
    final byte[] byteArray = testString.getBytes();
    System.out.println(Hex.encode(byteArray));

  #21楼

   Converts bytes data to hex characters

              @param bytes byte array to be converted to hex string
              @return byte String in hex format
            private static String bytesToHex(byte[] bytes) {
                char[] hexChars = new char[bytes.length * 2];
                int v;
                for (int j = 0; j < bytes.length; j++) {
                    v = bytes[j] & 0xFF;
                    hexChars[j * 2] = HEX_ARRAY[v >>> 4];
                    hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
                }
                return new String(hexChars);
            }

  #22楼

  为简单功能添加实用程序jar不是一个好选择。 而是汇编您自己的实用程序类。 以下是可能的更快实施。

<p><pre>public class ByteHex {

public static int hexToByte(char ch) {
    if (&#39;0&#39;