Pregunta

He estado buscando 2 horas o mejor para usar el método Read7BitencodeDint para esto. Necesito usarlo de alguna manera para reducir el tamaño de mi archivo (en este caso probablemente en 100 MB o más). También estaba buscando usar el método de lectura, ya que parece hacer aproximadamente lo mismo. Pero eso parece menos apropiado y no estoy realmente seguro de que funcione. Si hay alguna otra alternativa a esto de la que desconoce, estaría abierto a usar eso también.

En suma. ¿Cómo implementaría el método Read7BitEncodeDint en el siguiente código? Además, tampoco estoy demasiado seguro de que mi método para Write7BitencodeDint sea correcto.

    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();
            }
        }
    }
¿Fue útil?

Solución

Aquí hay una forma de hacerlo:

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

Y algún código de prueba:

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

Otros consejos

Este es un caso en el que tiene una solución a un problema en mente antes de hacer la pregunta, incluso si la solución es una mala idea. Hay una entrada de blog en cualquiera Blog de Raymond Chen, Blog de Eric Lippert O probablemente ambos sobre este tema, pero no pude encontrarlo (ellos).

En los últimos 20 años, la necesidad de preocuparse por los personajes de 7 bits se ha eliminado principalmente. Y, la noción de tratar de salvar el espacio en el disco al usarlos es evidentemente ridícula.

La única forma en que esto funcionaría si funcionara si se superpusiera a los personajes para que combinara efectivamente 8 caracteres en 7 bytes. Casi puedo garantizar sin mirar que eso no es lo que Read7BitEncodedInt lo hace.

(En realidad, no tengo idea de lo que hace, pero afortunadamente, no me importa)

Si necesita trabajar con archivos grandes, use la compresión de algún tipo. Zip, GZIP, 7-Zip, lo que sea.

EDITAR: Dado que en realidad no está preguntando por las cadenas, esto puede ser útil. Ymmv, sin embargo. Busca el ReadVLI y WriteVLI funciones.

http://gilgamesh.hamsterrepublic.com/websvn/filedetails.php?repname=ohrrpgce&path=%2FWIP%2freload.bas&rev=3568&peg=4164

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top