Ich glaube, Sie suchen nach etwas entlang der Linien eines 7-Bit-codierten integer:
protected void Write7BitEncodedInt(int value)
{
uint num = (uint) value;
while (num >= 0x80)
{
this.Write((byte) (num | 0x80));
num = num >> 7;
}
this.Write((byte) num);
}
(entnommen aus System.IO.BinaryWriter.Write(String)
).
Die Rückseite ist in der System.IO.BinaryReader
Klasse gefunden und sieht ungefähr so aus:
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;
}
Ich hoffe, dass dies nicht Hausaufgaben, auch wenn wirklich, wie es ist riecht.
EDIT:
Ok, so sie alle zusammen für Sie zu setzen:
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();
}
}
}
Die Gesamtgröße ich erhalte, ist 1871 Bytes für Zahlen 1-1000. Btw, könnten Sie einfach angeben, ob dies Hausaufgaben sind? Natürlich werden wir immer noch auf beiden Wegen helfen. Aber wir würden viel lieber versuchen Sie ein wenig härter, so dass Sie tatsächlich für sich selbst lernen können.
EDIT # 2:
Wenn Sie nur ihnen die Fähigkeit zu ignorieren wollen packen sie wieder zu entschlüsseln, können Sie etwas tun können:
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]);
}
}
Diese alle Bytes ignoriert, die Null sind (von MSB zu LSB). Also für 0-255 wird es ein Byte verwenden. Wie an anderer Stelle angegeben, können Sie die Daten nicht dekodieren, da der Stream jetzt mehrdeutig ist. Als Nebenbemerkung beschränkt sich dieser Ansatz auf 1743 Byte (im Gegensatz zu 1871 mit 7-Bit-Codierung).
riecht wie Hausaufgaben. Wenn ja, bitte entsprechend markieren. – zvolkov
versuchen Sie die 7-Bit-codierte Int. schau dir meine Antwort unten an. –