Нужна помощь с использованием read7bitencodentint
-
27-10-2019 - |
Вопрос
Я искал 2 часа или лучше, чтобы использовать метод Read7biteNcodeNINT для этого. Мне нужно каким -то образом использовать его, чтобы уменьшить размер моего файла (в этом случае, вероятно, на 100 МБ или более). Я также смотрел на использование метода ReadString, так как он, кажется, делает примерно то же самое. Но это кажется менее подходящим, и я не совсем уверен, что это сработает. Если есть какая -то другая альтернатива для этого, о которой я не знаю, я бы тоже был открыт для этого.
В сумме. Как я бы внедрил метод read7biteNcodeNInt в следующий код? Кроме того, я не слишком уверен, что мой метод писать 7biteNcodeNtint также верен.
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();
}
}
}
Решение
Вот способ сделать это:
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);
}
Другие советы
Это тот случай, когда у вас есть решение проблемы, прежде чем задать вопрос, даже если решение - плохая идея. Есть запись в блоге на любой Блог Раймонда Чена, Блог Эрика Липперта Или, наверное, оба по этому вопросу, но я не смог его найти (их).
За последние 20 лет необходимость заботы о 7-битных персонажах была в основном снят с ума. И понятие попытки спасти пространство дискового пространства с помощью их, явно смешно.
Единственный способ, которым это будет работать, было бы, если бы вы перекрывали символы, так что вы эффективно объединили 8 символов в 7 байтов. Я почти могу гарантировать, не глядя, что это не то, что Read7BitEncodedInt
делает.
(На самом деле, я понятия не имею, что это делает, но, к счастью, мне все равно)
Если вам нужно работать с большими файлами, используйте какое -то сжатие. Zip, Gzip, 7-Zip, что угодно.
РЕДАКТИРОВАТЬ: Поскольку вы на самом деле не спрашиваете о строках, тогда это может быть полезно. YMMV, однако. Ищите ReadVLI
а также WriteVLI
функции.