【发布时间】:2011-06-11 23:57:08
【问题描述】:
我一直在寻找 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();
}
}
}
【问题讨论】:
-
如果我理解正确,您想使用 7bitencodedint 方法来减小文件大小。所以你需要更新你的 SaveFile 方法以利用 write7bitencodedint 方法,并确保你的 loadfile 方法可以读回它?
-
@Brian Dishaw Ya 总结得差不多了。
-
我找到了一篇文章,它解释了为什么它们是受保护的方法以及如何在自己的代码中实现它们。我不确定这有多过时。我建议将程序集加载到 .net 反射器之类的东西中,并查看这些方法的实现。 dotnet247.com/247reference/msgs/53/268025.aspx
-
您能解释一下您认为这样做可以减少文件大小吗?因为我对 7 位编码的理解是它至少增加了 14% 的文件大小。 7 位编码的目的是为了与非常旧的数据传输系统兼容,这些系统期望每个字节的最高位都关闭。它解压缩整数,而不压缩它们。如果需要的话,为什么不使用标准压缩库来压缩文件?
-
@Eric,该方法使用的编码与Protocol Buffers' varints基本相同。它减少了小整数的大小,而大整数最多可以占用 5 个字节。
标签: c# .net binary binarywriter 7-bit