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]);
}
}
これは、0 のバイト (MSB から LSB まで) を無視します。したがって、0 ~ 255 の場合は 1 バイトを使用します。他の場所で述べているように、ストリームがあいまいであるため、データをデコードすることはできません。補足として、このアプローチでは 1743 バイトに圧縮されます (7 ビット エンコーディングを使用する 1871 とは対照的です)。