将字节 [] 转换为 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™ programming language.)
....
*/
所以,本质上,不能用数字来判断内容是否相等。
例如,您可以使用:Arrays.equals().
本质上,内容是相同的(数组是)。
但是,您错误地检查了特定于对象实例的内容。
但是您的代码仍然存在一个错误:
String thisByte = "".format("%x", a[i]);
而不是 %x 使用 %02x,这确保输出至少为 2 位数字(并且当它是字节值时最大长度也为 2)。
(此外 String.format(..) 比 "".format(..))
更容易被接受
我正在尝试将 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™ programming language.)
....
*/
所以,本质上,不能用数字来判断内容是否相等。 例如,您可以使用:Arrays.equals().
本质上,内容是相同的(数组是)。 但是,您错误地检查了特定于对象实例的内容。
但是您的代码仍然存在一个错误:
String thisByte = "".format("%x", a[i]);
而不是 %x 使用 %02x,这确保输出至少为 2 位数字(并且当它是字节值时最大长度也为 2)。 (此外 String.format(..) 比 "".format(..))
更容易被接受