Question

Je l'ai cherché pendant 2 heures ou plus pour un moyen d'utiliser la méthode Read7BitEncodedInt pour cela. Je dois l'utiliser en quelque sorte de réduire ma taille de fichier (dans ce cas, probablement par 100 Mo ou plus). Je cherchais aussi à utiliser la méthode ReadString car il semble faire à peu près la même chose. Mais cela semble moins approprié et je ne suis pas vraiment sûr que cela fonctionnerait. S'il y a une autre alternative à ce que je ne suis pas au courant de je serais ouvert à l'aide aussi.

En résumé. Comment puis-je mettre en œuvre la méthode Read7BitEncodedInt dans le code suivant? En outre, je ne suis pas trop certain que ma méthode pour Write7BitEncodedInt est correcte soit.

    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();
            }
        }
    }
Était-ce utile?

La solution

Voici une façon de le faire:

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);
    }
}

Et un code de test:

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);
}

Autres conseils

Ceci est un cas où vous avez une solution à un problème à l'esprit avant de poser la question, même si la solution est une mauvaise idée. Il y a une entrée de blog sur blog de Raymond Chen, blog de Eric Lippert ou probablement à la fois sur ce sujet, mais je ne pouvais pas trouver (les).

Au cours des 20 dernières années, qui ont besoin de se soucier de caractères 7 bits a été la plupart du temps éliminés. Et la notion d'essayer d'économiser de l'espace disque en les utilisant est manifestement ridicule.

La seule façon serait même le travail serait si vous CHEVAUCHENT caractères afin que vous efficacement combinés 8 caractères en 7 octets. Je peux presque garantir sans regarder que ce n'est pas ce que fait Read7BitEncodedInt.

(En fait, je ne sais pas ce qu'il fait, mais heureusement, je ne foutais)

Si vous avez besoin de travailler avec des fichiers volumineux, utilisez la compression d'une certaine sorte. Zip, GZip, 7-Zip, peu importe.

EDIT: Puisque vous ne demandez pas réellement sur les chaînes, cela peut être utile. YMMV, cependant. Recherchez les fonctions de ReadVLI et WriteVLI.

http: // Gilgamesh .hamsterrepublic.com / websvn / filedetails.php? repname = OHRRPGCE & path =% 2Fwip% 2Freload.bas & rev = 3568 & cheville = 4164

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top