在使用Read7BitEncodedInt时需要帮助

| 我一直在寻找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();
            }
        }
    }
    
已邀请:
        这是一种实现方法:
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);
}
    
        在这种情况下,即使您想出一个好主意,也可以在提出问题之前就先想到一个解决方案。在雷蒙德·陈(Raymond Chen)的博客,埃里克·利珀特(Eric Lippert)的博客上都有一个博客条目,或者可能两者都有关于该主题的条目,但我找不到(他们)。 在过去的20年中,几乎已经不再需要关心7位字符了。而且,试图通过使用磁盘来节省磁盘空间的想法显然是荒谬的。 唯一可行的方法是重叠字符,以便有效地将8个字符组合成7个字节。我几乎可以保证,不用看那不是
Read7BitEncodedInt
所做的。 (实际上,我不知道它的作用,但幸运的是,我不在乎) 如果需要处理大文件,请使用某种压缩方式。 Zip,GZip,7-Zip等。 编辑:由于您实际上并未询问字符串,所以这可能有用。 YMMV,但是。查找
ReadVLI
WriteVLI
函数。 http://gilgamesh.hamsterrepublic.com/websvn/filedetails.php?repname=ohrrpgce&path=%2Fwip%2Freload.bas&rev=3568&peg=4164     

要回复问题请先登录注册