read7bitencodedintを使用してサポートが必要です
-
27-10-2019 - |
質問
このためにread7bitencodedintメソッドを使用する方法を2時間以上検索しています。ファイルサイズ(この場合は100MB以上)を減らすために、どういうわけかそれを使用する必要があります。また、ReadStringメソッドの使用を検討していました。これは、ほぼ同じことをしているようだからです。しかし、それはそれほど適していないようで、私はそれがうまくいくかどうか本当に確信がありません。これに代わるものが他にもある場合、私はそれを使用することにもオープンだと思っていません。
要約。 read7bitencodedintメソッドを次のコードに実装するにはどうすればよいですか?また、7bitencodedIntを書く私の方法も正しいことを確信していません。
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
機能。