将二进制位转换为字节数组

Posted

技术标签:

【中文标题】将二进制位转换为字节数组【英文标题】:Converting Binary bits to the bytes array 【发布时间】:2021-12-05 19:44:47 【问题描述】:

我正在尝试在给定的二进制文本中翻转一点并将我的二进制字符串更改为字节数组 我正在翻转的位索引是 0~63 之间的范围。我翻转 1~63 没有任何问题。但是,每当我翻转该位的第 0 个索引并更改为字节时,我如何获得 9 个块段。像这样:(BF代表翻转前,AF代表翻转后)

输入是BF的二进制字符串 输出为AF的二进制字符串

BF:0100011001100001011000110110010101100010011011110110111101101011 AF:1100011001100001011000110110010101100010011011110110111101101011 分段:0 -58 97 99 101 98 111 111 107

线程“main”javax.crypto.IllegalBlockSizeException 中的异常:输入长度不是 8 个字节的倍数

这是我的翻转位代码:

public static String flipBit(String s1, int num)
    
        char[] arr = s1.toCharArray();
        System.out.println(num);
        System.out.print("BF:");
        for(int i = 0; i<arr.length;i++)
        
            System.out.print(arr[i]);
        
        System.out.println();
        if(arr[num] == '1')
        
        //  System.out.println("Hello");
            arr[num] = '0';
        
        else 
            if(arr[num] == '0')
        
        //  System.out.println("HI");
            arr[num] = '1';
        
        
        return String.copyValueOf(arr);
    

这是我将二进制字符串更改为字节的代码:

    public static byte[] binaryToByte(String s1)
    
        byte[] array = new BigInteger(s1,2).toByteArray();
        return array;
    

这里是主要功能:

String flipedBit = flipBit(plaintextBinary,0);
        
        System.out.println("AF:" + flipedBit);
        
        byte[] fbp = binaryToByte(flipedBit);
for(int i = 0; i<fbp.length;i++)
        
            System.out.print(fbp[i] + " ");
        

Cipher encrypt2 = Cipher.getInstance("DES/ECB/NoPadding");
        Key ky2 = new SecretKeySpec(key,"DES");
        encrypt2.init(Cipher.ENCRYPT_MODE,ky2);
        byte[] cbp = encrypt.doFinal(fbp);

如果我翻转唯一的第 0 个索引,为什么会得到 9 个段?

【问题讨论】:

为什么不显示输入、预期输出和反转的位。 你在哪里打电话javax.crypto 我和@WJS 在一起。显示函数的输入、预期输出和实际输出。 【参考方案1】:

我相信这是您的BigInteger 转换方法。第一个字节是符号位,所以它返回 9 个字节,第一个是 0。

String s = "1100011001100001011000110110010101100010011011110110111101101011";
byte[] b = new BigInteger(s,2).toByteArray();
System.out.println(Arrays.toString(b));

打印

[0, -58, 97, 99, 101, 98, 111, 111, 107]

来自 BigInteger 的 JavaDoc

返回一个字节数组,其中包含此 BigInteger 的二进制补码表示。字节数组将采用大端字节序:最高有效字节位于第零个元素中。该数组将包含表示此 BigInteger 所需的最小字节数,包括至少一个符号位,即 (ceil((this.bitLength() + 1)/8))。 (此表示与 (byte[]) 构造函数兼容。)

【讨论】:

以上是关于将二进制位转换为字节数组的主要内容,如果未能解决你的问题,请参考以下文章

Java将字节数组转换为十六进制字节数组[重复]

将字节数组转换为十进制

将 32 位浮点音频转换为 16 位字节数组?

如何将十六进制字符串转换为字节数组,以及十六进制字符串中的字节数组?

从字节数组转换为字符串十六进制c# [重复]

是否可以将字符串转换为二进制表示的字节数组