我正在尝试将byte []转换为Hex字符串,将相同的Hex字符串转换为android中的byte [],数据不匹配。
前:
收到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;
}
答案 0 :(得分:3)
我假设您通过打印对象获得 [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。 未针对特定类实现的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™ programming language.)
....
*/
因此,实质上,这些数字不能用于确定内容是否相等。 例如,你可以使用:Arrays.equals()。
本质上,内容是相同的(数组是)。 但是,您错误地检查了特定于对象实例的内容。
但是你的代码确实有一个错误:
String thisByte = "".format("%x", a[i]);
而不是%x 使用%02x ,这可以确保输出至少为2位(当其字节值也是最大长度2时)。 (String.format(..)比“.format(..)”
更容易接受答案 1 :(得分:0)
我使用以下内容并且可以使用。
/**
* 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;
}
答案 2 :(得分:-1)
请查看我的代码
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;
}
}