使用Read7BitEncodedInt需要帮助
本文关键字:帮助 Read7BitEncodedInt 使用 | 更新日期: 2023-09-27 17:59:01
我已经搜索了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);
}
在这种情况下,即使解决方案是个坏主意,在提出问题之前,您也会想到问题的解决方案。陈的博客、李柏特的博客或者两者都有关于这个主题的博客,但我找不到。
在过去的20年里,对7位字符的关心已经基本上被淘汰了。而且,试图通过使用它们来节省磁盘空间的想法显然是荒谬的。
唯一可行的方法是重叠字符,从而将8个字符有效地组合成7个字节。我几乎可以不用看就保证Read7BitEncodedInt
不是这样做的。
(事实上,我不知道它做什么,但幸运的是,我不在乎)
如果您需要处理大文件,请使用某种压缩。Zip,GZip,7-Zip,随便什么。
编辑:由于您实际上并不是在询问字符串,所以这可能很有用。然而,YMMV。查找ReadVLI
和WriteVLI
函数。
http://gilgamesh.hamsterrepublic.com/websvn/filedetails.php?repname=ohrrpgce&路径=%2Wip%2Load.bas&rev=3568&peg=4164