需要帮助使用Read7BitEncodedInt

时间:2011-06-11 23:57:08

标签: c# .net binary binarywriter 7-bit

我一直在寻找2小时或更长时间来使用Read7BitEncodedInt方法。我需要以某种方式使用它来减少我的文件大小(在这种情况下可能减少100mb或更多)。我也在考虑使用ReadString方法,因为它似乎做了大致相同的事情。但这似乎不太合适,我不确定它会起作用。如果还有其他替代方案,我不知道我也愿意使用它。

总结。如何将Read7BitEncodedInt方法实现为以下代码? 另外,我不太确定我的Write7BitEncodedInt方法也是正确的。

    public void SaveFile()
    {
        using (FileStream stream = new FileStream("C:\\A_random.txt", FileMode.Create))
        {
            using (BinaryWriter writer = new BinaryWriter(stream))
            {
                for (int i = 0; i < typeCount.Count; i++)
                {
                    writer.Write((byte)typeCount[i]);
                    writer.Write(type[i]);
                }
                writer.Close();
            }
        }
        LoadFile();
    }

    public void LoadFile()
    {
        using (FileStream stream = new FileStream("C:\\A_random.txt", FileMode.Open))
        {
            using (BinaryReader reader = new BinaryReader(stream))
            {
                int i = 0;
                while (stream.Position != stream.Length)
                {
                    int count = reader.Read7BitEncodedInt();
                    byte val = reader.ReadByte();
                    for (int ii = 0; ii < count; ii++)
                    {
                        grid[i].val1 = i;
                        grid[i].val2 = val;
                        grid[i].val3 = vect;
                        i++;
                    }
                }
                reader.Close();
            }
        }
    }

2 个答案:

答案 0 :(得分:6)

这是一种方法:

public class MyBinaryReader : BinaryReader {
    public MyBinaryReader(Stream stream) : base(stream) {}
    public new int Read7BitEncodedInt() {
        return base.Read7BitEncodedInt();
    }
}

public class MyBinaryWriter : BinaryWriter {
    public MyBinaryWriter(Stream stream) : base(stream) {}
    public new void Write7BitEncodedInt(int i) {
        base.Write7BitEncodedInt(i);
    }
}

还有一些测试代码:

void Main() {
var stream = new MemoryStream();

var writer = new MyBinaryWriter(stream);    

writer.Write7BitEncodedInt(100);
writer.Write7BitEncodedInt(1000);
writer.Write7BitEncodedInt(10000);
writer.Write7BitEncodedInt(100000);
writer.Write7BitEncodedInt(1000000);
writer.Write7BitEncodedInt(-1000000);

stream.Position = 0;

var reader = new MyBinaryReader(stream);    

Debug.Assert(reader.Read7BitEncodedInt() == 100);
Debug.Assert(reader.Read7BitEncodedInt() == 1000);
Debug.Assert(reader.Read7BitEncodedInt() == 10000);
Debug.Assert(reader.Read7BitEncodedInt() == 100000);
Debug.Assert(reader.Read7BitEncodedInt() == 1000000);
Debug.Assert(reader.Read7BitEncodedInt() == -1000000);
}

答案 1 :(得分:0)

在您提出问题之前,这是一个解决问题的方法,即使解决方案是个坏主意。 Raymond Chen's blogEric Lippert's blog或者两者都有关于此主题的博客条目,但我找不到它们(它们)。

在过去的20年中,需要关注7位字符的问题已经被逐步淘汰。并且,尝试使用它们来节省磁盘空间的想法显然是荒谬的。

这甚至可以工作的唯一方法是,如果你重叠字符,那么你有效地将8个字符组合成7个字节。我几乎可以保证不会发现那不是Read7BitEncodedInt所做的。

(实际上,我不知道它做了什么,但幸运的是,我不在乎)

如果您需要处理大型文件,请使用某种压缩。 Zip,GZip,7-Zip等等。

编辑:因为你实际上并没有询问字符串,所以这可能是有用的。但是,YMMV。查找ReadVLIWriteVLI函数。

http://gilgamesh.hamsterrepublic.com/websvn/filedetails.php?repname=ohrrpgce&path=%2Fwip%2Freload.bas&rev=3568&peg=4164