我认为您正在寻找类似于 7 位编码整数的东西:
protected void Write7BitEncodedInt(int value)
{
uint num = (uint) value;
while (num >= 0x80)
{
this.Write((byte) (num | 0x80));
num = num >> 7;
}
this.Write((byte) num);
}
(取自System.IO.BinaryWriter.Write(String)
)。
在System.IO.BinaryReader
类中找到相反的内容,看起来像这样:
protected internal int Read7BitEncodedInt()
{
byte num3;
int num = 0;
int num2 = 0;
do
{
if (num2 == 0x23)
{
throw new FormatException(Environment.GetResourceString("Format_Bad7BitInt32"));
}
num3 = this.ReadByte();
num |= (num3 & 0x7f) << num2;
num2 += 7;
}
while ((num3 & 0x80) != 0);
return num;
}
我希望这不是家庭作业,即使真的闻起来像。
编辑:
好的,所以为您整理一下:
using System;
using System.IO;
namespace EncodedNumbers
{
class Program
{
protected static void Write7BitEncodedInt(BinaryWriter bin, int value)
{
uint num = (uint)value;
while (num >= 0x80)
{
bin.Write((byte)(num | 0x80));
num = num >> 7;
}
bin.Write((byte)num);
}
static void Main(string[] args)
{
MemoryStream ms = new MemoryStream();
BinaryWriter bin = new BinaryWriter(ms);
for(int i = 1; i < 1000; i++)
{
Write7BitEncodedInt(bin, i);
}
byte[] data = ms.ToArray();
int size = data.Length;
Console.WriteLine("Total # of Bytes = " + size);
Console.ReadLine();
}
}
}
对于数字 1-1000,我得到的总大小是 1871 字节。顺便说一句,你能简单地说明这是否是家庭作业吗?显然,无论哪种方式,我们仍然会提供帮助。但我们更希望您更加努力地尝试,这样您才能真正为自己学习。
编辑#2:
如果您只想打包它们而忽略解码它们的能力,您可以执行以下操作:
protected static void WriteMinimumInt(BinaryWriter bin, int value)
{
byte[] bytes = BitConverter.GetBytes(value);
int skip = bytes.Length-1;
while (bytes[skip] == 0)
{
skip--;
}
for (int i = 0; i <= skip; i++)
{
bin.Write(bytes[i]);
}
}
这将忽略任何为零的字节(从 MSB 到 LSB)。所以对于 0-255 它将使用一个字节。正如其他地方所述,这将不允许您将数据解码回来,因为流现在是模棱两可的。附带说明一下,这种方法将其压缩到 1743 字节(而不是使用 7 位编码的 1871 字节)。