Нужна помощь с использованием Read7BitEncodedInt

Я искал 2 часа или лучше для способа использования метода Read7BitEncodedInt для этого. Мне нужно как-то использовать его, чтобы уменьшить размер моего файла (в этом случае, вероятно, на 100 мб или более). Я также рассматривал использование метода ReadString, поскольку он, похоже, делает примерно то же самое. Но это кажется менее подходящим, и я не уверен, что он сработает. Если есть какая-то другая альтернатива этому, я не знаю, что я тоже буду использовать это.

В суммировании. Как реализовать метод Read7BitEncodedInt в следующем коде? Кроме того, я не слишком уверен, что мой метод Write7BitEncodedInt также верен.

    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();
            }
        }
    }
2
задан 12 июня '11 в 2:57
источник поделиться
2 ответов

Вот как это сделать:

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

И некоторый тестовый код:

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);
}
6
ответ дан 14 июня '11 в 14:20
источник

Это случай, когда у вас есть решение проблемы, прежде чем вы зададите вопрос, даже если решение является плохим. Существует запись в блоге на блог Raymond Chen, Блог Эрика Липперта или, возможно, оба по этому вопросу, но я не мог найти его (их).

За последние 20 лет необходимость ухода за 7-битными символами была в основном прекращена. И понятие попыток сэкономить дисковое пространство, используя их, явно смешно.

Единственный способ, с помощью которого это могло бы работать, было бы, если бы вы перекрывали символы, чтобы эффективно объединить 8 символов в 7 байт. Я почти гарантирую, не глядя, что это не то, что делает Read7BitEncodedInt.

(На самом деле, я понятия не имею, что он делает, но, к счастью, мне все равно)

Если вам нужно работать с большими файлами, используйте какое-то сжатие. Zip, GZip, 7-Zip, что угодно.

EDIT: поскольку вы на самом деле не спрашиваете о строках, это может быть полезно. YMMV, однако. Найдите функции ReadVLI и WriteVLI.

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

1
ответ дан 12 июня '11 в 3:49
источник

Другие вопросы по меткам или Задайте вопрос