将字节 [] 转换为 android 中的十六进制字符串

Converting byte[] to Hex string in android

我正在尝试将 byte[] 转换为十六进制字符串,并将相同的十六进制字符串转换为 android 中的 byte[],数据不匹配。

例如:

收到字节[]数据:[B@b39c86a

转换后的十六进制字符串:8be897cc3c4d9e5dd6a6bbd106d8e8d487691b56

当我解码十六进制字符串时,我得到 [B@ea6d15b,但它应该是 [B@b39c86a

我正在使用下面的代码进行转换。

public String byte2hex(byte[] a) {
        /*StringBuilder sb = new StringBuilder(a.length * 2);

        for (byte b : a)
            sb.append(String.format("%02x", b & 0xff));
        return sb.toString();*/

        String hexString = "";

        for(int i = 0; i < a.length; i++){
            String thisByte = "".format("%x", a[i]);
            hexString += thisByte;
        }

        return hexString;

    }
    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)
                    + Character.digit(s.charAt(i + 1), 16));
        }
        return data;*/

        byte[] bytes = new byte[s.length() / 2];

        for(int i = 0; i < s.length(); i += 2){
            String sub = s.substring(i, i + 2);
            Integer intVal = Integer.parseInt(sub, 16);
            bytes[i / 2] = intVal.byteValue();
            String hex = "".format("0x%x", bytes[i / 2]);
        }

        return bytes;
    }

请看我的代码

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

public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}


public static byte[] hexStringToByteArray(String s) {
    try {

        int len = s.length();
        if(len>1) {
            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)
                        + Character.digit(s.charAt(i + 1), 16));
            }
            return data;
        }
        else

        {
            return  null;
        }
    }catch (Exception e)
    {
        throw e;
    }
}

我使用下面的,它们有效。

/**
 * Converts byte array to hex string
 *
 * @param bytes The data
 * @return String represents the data in HEX string
 */
public static String byteArrayToHexString(final byte[] bytes) {
    StringBuilder sb = new StringBuilder();
    for(byte b : bytes){
        sb.append(String.format("%02x", b&0xff));
    }
    return sb.toString();
}

/**
 * Converts hex string to byte array
 *
 * @param s The data in string
 * @return byte represents the string in bytes
 */
public static byte[] hexStringToByteArray(final String s) {
    if (s == null) {
        return (new byte[]{});
    }

    if (s.length() % 2 != 0 || s.length() == 0) {
        return (new byte[]{});
    }

    byte[] data = new byte[s.length() / 2];
    for (int i = 0; i < s.length(); i += 2) {
        try {
            data[i / 2] = (Integer.decode("0x" + s.charAt(i) + s.charAt(i + 1))).byteValue();
        } catch (NumberFormatException e) {
            return (new byte[]{});
        }
    }
    return data;
}

我假设您通过打印对象获得 [B@b39c86a。 这些数字是由 toString() 方法生成的,不会告诉您有关数组内容的任何信息。

例如,如果您 运行 此代码:

    byte[] arr = new byte[]{1,2,3,4};
    byte[] arr2 = new byte[4];
    for(int i=0; i < 4; i++)
        arr2[i] = arr[i];


    System.out.println("Array 1: " + arr);
    System.out.println("Array 2: " + arr2);
    System.out.println("arr.equals: " + arr.equals(arr2));
    System.out.println("Arrays.equals:  " + Arrays.equals(arr,arr2));
    System.out.printf("Contents of array 1: %s\n", Arrays.toString(arr));
    System.out.printf("Contents of array 2: %s\n", Arrays.toString(arr2));

输出例如是:

Array 1: [B@74a14482
Array 2: [B@1540e19d
arr.equals: false
Arrays.equals:  true
Contents of array 1: [1, 2, 3, 4]
Contents of array 2: [1, 2, 3, 4]

toString 方法的格式为 ClassName @hashCode。 未针对特定 class 实现的 hashCode(与字节数组的情况一样)。

如果您查看 Javadoc,它指出:

/**
....
 * As much as is reasonably practical, the hashCode method defined by
 * class {@code Object} does return distinct integers for distinct
 * objects. (This is typically implemented by converting the internal
 * address of the object into an integer, but this implementation
 * technique is not required by the
 * Java&trade; programming language.)
....
*/

所以,本质上,不能用数字来判断内容是否相等。 例如,您可以使用:Arrays.equals().

本质上,内容是相同的(数组是)。 但是,您错误地检查了特定于对象实例的内容。

但是您的代码仍然存在一个错误:

String thisByte = "".format("%x", a[i]);

而不是 %x 使用 %02x,这确保输出至少为 2 位数字(并且当它是字节值时最大长度也为 2)。 (此外 String.format(..) 比 "".format(..))

更容易被接受