質問

このために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。を探します ReadVLIWriteVLI 機能。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top