Java:将HEX字节数组转换为16位定长二进制String
Java: Convert HEX byte array to 16 fixed length binary String
我有一个字节数组是通过MYBATIS自动转换得到的。
在 ORACLE DB 列(RAW 类型)中,我有 HEX 值(例如:0x0、0x81、0xC801)。
该值最多存储 2 个字节(例如 1100100000000001 -> 0xC801、0000000000000000 -> 0x0)
我在读取和转换此值时遇到问题。
我需要将自动转换得到的字节数组,转换成16位定长二进制字符串
例如,如果 DB 中的值为 0x0:
- 字节数组为[0](MYBATIS自动转换)
- 我需要的二进制字符串必须是0000000000000000
例如,如果 DB 中的值为 0xC801:
- 字节数组为[0, -56, 1](MYBATIS自动转换)
- 我需要的二进制字符串必须是1100100000000001
我该怎么做?
我尝试过此解决方案,但不适用于像 0x0 或 0x81 这样的十六进制值,因为 0x0 映射到“0”,而 0x81 映射到“100000001”。缺少 0 个填充...我不知道如何在此脚本中添加填充。
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToBinary(byte[] bytes) {
return hexToBin(bytesToHex(bytes));
}
public static String hexToBin(String s) {
if (StringUtils.isNotEmpty(s)) {
return new BigInteger(s, 16).toString(2);
}
return "";
}
public static String bytesToHex(byte[] bytes) {
if (bytes != null && bytes.length > 0) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
return "";
}
尝试使用 BigInteger
byte[] bytes = {0, -56, 1};
// array, offset, length
String result = new BigInteger(bytes).setBit(16).toString(2).substring(1);
System.out.println(result);
版画
1100100000000001
我有一个字节数组是通过MYBATIS自动转换得到的。 在 ORACLE DB 列(RAW 类型)中,我有 HEX 值(例如:0x0、0x81、0xC801)。 该值最多存储 2 个字节(例如 1100100000000001 -> 0xC801、0000000000000000 -> 0x0)
我在读取和转换此值时遇到问题。
我需要将自动转换得到的字节数组,转换成16位定长二进制字符串
例如,如果 DB 中的值为 0x0:
- 字节数组为[0](MYBATIS自动转换)
- 我需要的二进制字符串必须是0000000000000000
例如,如果 DB 中的值为 0xC801:
- 字节数组为[0, -56, 1](MYBATIS自动转换)
- 我需要的二进制字符串必须是1100100000000001
我该怎么做?
我尝试过此解决方案,但不适用于像 0x0 或 0x81 这样的十六进制值,因为 0x0 映射到“0”,而 0x81 映射到“100000001”。缺少 0 个填充...我不知道如何在此脚本中添加填充。
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToBinary(byte[] bytes) {
return hexToBin(bytesToHex(bytes));
}
public static String hexToBin(String s) {
if (StringUtils.isNotEmpty(s)) {
return new BigInteger(s, 16).toString(2);
}
return "";
}
public static String bytesToHex(byte[] bytes) {
if (bytes != null && bytes.length > 0) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
return "";
}
尝试使用 BigInteger
byte[] bytes = {0, -56, 1};
// array, offset, length
String result = new BigInteger(bytes).setBit(16).toString(2).substring(1);
System.out.println(result);
版画
1100100000000001