将位写入文件并将其检索为" 0101 .."在java?

时间:2016-04-10 21:51:15

标签: java bit-manipulation binaryfiles

我正在研究一种压缩算法,为此我需要将字符串写入二进制文件并再次检索到与String完全相同的内容! 比方说,我有一个字符串" 10100100100 ....."我会把它们写成一个文件作为位

  

(不是chars' 0'' 1')

。并作为位读回并转换为字符串... 这适用于大量数据(> 100兆字节)。 这样做有什么简洁快捷的方法吗?

到目前为止,我尝试(并且失败)通过子串到8位然后作为ASCII字符到字符串,最后到.txt文件将它们写入字节。

{
    String Bits="10001010100000000000"; // a lot larger in actual program 

    String nCoded="";
    char nextChar;
    int i = 0;
    for(i=0; i < Bits.length()-8; i += 8){

        nextChar = (char)Integer.parseInt( Bits.substring(i, i+8), 2 );
        nCoded += nextChar;
    }

    // for the remainding bits, padding
    if(newBits.length()%8 != 0){
        nCoded+=(char)Integer.parseInt(Bits.substring(i), 2);
    }
    nCoded+=(char)Bits.length()%8; //to track the remainder of Bits that was padded 

    writeToTextFile( nCoded, "file.txt"); //write the nCoded string to file
}            

但这似乎破坏了信息并且效率低下。 再次澄清一下,我不想写 String ,它只是实际数据的表示。所以,我想

  

将字符串表示形式的每个0和1转换为二进制形式   并将其写入档案。

1 个答案:

答案 0 :(得分:0)

这是一个方法,您可以使用该方法将String转换为一系列位,准备输出到文件:

private byte[] toByteArray(String input){
    //to charArray
    char[] preBitChars = input.toCharArray();
    int bitShortage = (8 - (preBitChars.length%8));
    char[] bitChars = new char[preBitChars.length + bitShortage];
    System.arraycopy(preBitChars, 0, bitChars, 0, preBitChars.length);

    for (int  i= 0;  i < bitShortage;  i++) {
        bitChars[preBitChars.length + i]='0';
    }

    //to bytearray
    byte[] byteArray = new byte[bitChars.length/8];
    for(int i=0; i<bitChars.length; i++) {
        if (bitChars[i]=='1'){
            byteArray[byteArray.length - (i/8) - 1] |= 1<<(i%8);
        }
    }
    return byteArray;
}

传递字符串&#34; 01010101&#34;将结果[85]作为字节[]返回。

事实证明,有一种更简单的方法。有一个返回Byte.parseByte(String)对象的静态Byte。主叫:

 Byte aByte = Byte.parseByte("01010101");
 System.out.println(aByte);

显示相同的值:85。

所以你可以在这里问几个问题。

  1. 为什么我们传递一个长度为8个字符的字符串。好吧,你可以在字符串前加上第9个字符,这个字符代表一个符号位。我不认为你有这种情况,但如果你需要,Byte.parseByte()的文件应该是:
  2.   

    ASCII减号&#39; - &#39; (&#39; \ u002D&#39;)表示负值或ASCII加号&#39; +&#39; (&#39; \ u002B&#39;)表示正值。

    因此,根据这些信息,您需要手动将String拆分为8位字符串,并调用Byte.parseByte()为每个字符串获取Byte个对象。

    2)如何将位写入文件?不,文件写入以字节为单位完成。如果您需要编写该文件,然后将其读回并转换回String,则需要反转该过程并以byte[]的形式读取该文件,然后将其转换为它的字符串表示形式

    有关如何将字节转换为精美字符串格式的提示,请访问:

    Convert byte (java data type) value to bits (a string containing only 8 bits)