Java:将十六进制字节数组转换为16个固定长度的二进制字符串

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

我有一个字节数组,通过自动MYBATIS转换获得。 在ORACLEDB列(原始类型)中,我有十六进制值(例如:0x0、0x81、0xC801)。 此值最多存储2个字节(例如1100100000000001->0xC8010000000000000000->0x0)

读取和转换此值时出现问题

我需要将自动转换得到的字节数组转换成16个固定长度的二进制字符串

例如,如果DB中的值为0x0:

  • 字节数组为[0](自动进行MYBATIS转换)
  • 我需要的二进制字符串必须是0000000000000000
例如,如果DB中的值为0xC801:

  • 字节数组为[0,-56,1](自动MYBATIS转换)
  • 我需要的二进制字符串必须是110010000000001
我怎么能做到

我尝试使用此解决方案,但无法使用0x0或0x81等十六进制值,因为0x0映射到“0”,0x81映射到“10000001”。缺少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 "";
}
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位的值。这就是我说的。您最多只想转换两个字节(不管数组大小如何)。