Java:将十六进制字节数组转换为16个固定长度的二进制字符串
我有一个字节数组,通过自动MYBATIS转换获得。 在ORACLEDB列(原始类型)中,我有十六进制值(例如:0x0、0x81、0xC801)。 此值最多存储2个字节(例如1100100000000001->0xC8010000000000000000->0x0) 读取和转换此值时出现问题 我需要将自动转换得到的字节数组转换成16个固定长度的二进制字符串 例如,如果DB中的值为0x0:Java:将十六进制字节数组转换为16个固定长度的二进制字符串,java,arrays,binary,hex,byte,Java,Arrays,Binary,Hex,Byte,我有一个字节数组,通过自动MYBATIS转换获得。 在ORACLEDB列(原始类型)中,我有十六进制值(例如:0x0、0x81、0xC801)。 此值最多存储2个字节(例如1100100000000001->0xC8010000000000000000->0x0) 读取和转换此值时出现问题 我需要将自动转换得到的字节数组转换成16个固定长度的二进制字符串 例如,如果DB中的值为0x0: 字节数组为[0](自动进行MYBATIS转换) 我需要的二进制字符串必须是0000000000000000
- 字节数组为[0](自动进行MYBATIS转换)
- 我需要的二进制字符串必须是0000000000000000
- 字节数组为[0,-56,1](自动MYBATIS转换)
- 我需要的二进制字符串必须是110010000000001
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 "";
}
private static final char[]HEX_ARRAY=“0123456789ABCDEF”.tocharray();
公共静态字符串bytesToBinary(字节[]字节){
返回hexToBin(bytesToHex(字节));
}
公共静态字符串hexToBin(字符串s){
if(StringUtils.isNotEmpty){
返回新的BigInteger(s,16).toString(2);
}
返回“”;
}
公共静态字符串bytesToHex(字节[]字节){
if(bytes!=null&&bytes.length>0){
char[]hexChars=新字符[bytes.length*2];
对于(int j=0;j>>4];
hexChars[j*2+1]=十六进制数组[v&0x0F];
}
返回新字符串(hexChars);
}
返回“”;
}
尝试使用biginger
byte[] bytes = {0, -56, 1};
// array, offset, length
String result = new BigInteger(bytes).setBit(16).toString(2).substring(1);
System.out.println(result);
印刷品
1100100000000001
尝试使用
biginger
byte[] bytes = {0, -56, 1};
// array, offset, length
String result = new BigInteger(bytes).setBit(16).toString(2).substring(1);
System.out.println(result);
印刷品
1100100000000001
关闭,但使用输入
{0}
时,输出为0
,而不是请求的0000000000000000
。例如,可以按如下方式进行修复:new biginger(bytes).setBit(16).toString(2).substring(1)
如果使用new biginger(bytes)
而不是new biginger(bytes,0,3)
,则代码可以处理长度为1-4的任何字节数组,而不是仅处理长度为3的数组。biginger(byte[]val,int off,int len)
构造函数直到Java9才被添加,所以通过更改为biginger(byte[]val)
constructor它适用于所有Java版本(Java 1.1+)。非常感谢大家!使用您的解决方案解决:)关闭,但使用输入{0}
时,输出是0
,而不是请求的0000000000000000
。例如,可以按如下方式进行修复:new biginger(bytes).setBit(16).toString(2).substring(1)
如果使用new biginger(bytes)
而不是new biginger(bytes,0,3)
,则代码可以处理长度为1-4的任何字节数组,而不是仅处理长度为3的数组。biginger(byte[]val,int off,int len)
构造函数直到Java9才被添加,所以通过更改为biginger(byte[]val)
constructor它适用于所有Java版本(Java 1.1+)。非常感谢大家!使用您的解决方案解决:)是否始终只转换两个字节。您总是返回一个3字节数组吗?@WJS再次阅读问题。“字节数组为[0]”和“字节数组为[0,-56,1]”。问题有两个例子,长度分别为1和3,所以不,它并不总是只有两个字节。@Andreas标题说转换为16位字符串。这对我来说意味着2个字节。@WJS是的,问题文本显示了2个1字节和3字节的字节数组示例。因为第一个字节是0,所以最多还是16位的值。这就是我说的。您最多只想转换两个字节(不管数组大小)。是否始终只想转换两个字节。您总是返回一个3字节数组吗?@WJS再次阅读问题。“字节数组为[0]”和“字节数组为[0,-56,1]”。问题有两个例子,长度分别为1和3,所以不,它并不总是只有两个字节。@Andreas标题说转换为16位字符串。这对我来说意味着2个字节。@WJS是的,问题文本显示了2个1字节和3字节的字节数组示例。因为第一个字节是0,所以最多还是16位的值。这就是我说的。您最多只想转换两个字节(不管数组大小如何)。