如果你有二字符串(字面上串的对象仅包含1和0),你会怎么输出他们作为位成的文件?

这是对一个文本,压缩机,我的工作;它还是缠着我,和它会很高兴终于得到它的工作。谢谢!

有帮助吗?

解决方案

最简单的是简单地采取连续8人物,把它们变成一个字节和输出数据。垫零时结束,如果你可以识别的流,或者添加一个标题的长度(中位数),在开始该文件。

内环看起来是这样的:


byte[] buffer = new byte[ ( string.length + 7 ) / 8 ];
for ( int i = 0; i < buffer.length; ++i ) {
   byte current = 0;
   for ( int j = 7; j >= 0; --j )
       if ( string[ i * 8 + j ] == '1' )
           current |= 1 << j;
   output( current );
}

你只需要做一些调整,但这是一般性的想法。

其他提示

如果你是幸运的,java。数学。BigInteger可以为你做的一切。

String s = "11001010001010101110101001001110";
byte[] bytes = (new java.math.BigInteger(s, 2)).toByteArray();

这不取决于byte order(big-endian)和正确对准(如果的比特数不多8)被你想要什么,但它可能更易于修改的阵之后,而不是做字转换自己。

public class BitOutputStream extends FilterOutputStream
{
    private int buffer   = 0;
    private int bitCount = 0;

    public BitOutputStream(OutputStream out)
    {
        super(out);
    }

    public void writeBits(int value, int numBits) throws IOException
    {
        while(numBits>0)
        {
            numBits--;
            int mix = ((value&1)<<bitCount++);
            buffer|=mix;
            value>>=1;
            if(bitCount==8)
                align8();
        }
    }

    @Override
    public void close() throws IOException
    {
        align8(); /* Flush any remaining partial bytes */
        super.close();
    }

    public void align8() throws IOException
    {
        if(bitCount > 0)
        {
            bitCount=0;
            write(buffer);
            buffer=0;
        }
    }
}

然后...

if (nextChar == '0')
{
    bos.writeBits(0, 1);
}
else
{
    bos.writeBits(1, 1);
}

假设串具有多个八位,(你可以垫,否则),利用Java是建立在分析在整数。值的方法来这样做:

String s = "11001010001010101110101001001110";
byte[] data = new byte[s.length() / 8];
for (int i = 0; i < data.length; i++) {
    data[i] = (byte) Integer.parseInt(s.substring(i * 8, (i + 1) * 8), 2);
}

然后你应该可以写字节 FileOutputStream 很简单。

另一方面,如果你在寻找的效率,应该考虑不使用一串的存储位开始,但建立的字节直接在你的压缩机。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top