public void Generate() { RG.Init(); Rep0 = 1; while (Pos < BufferSize) { if (GetRndBit() == 0 || Pos < 1) Buffer[Pos++] = (byte) (RG.GetRnd(8)); else { int len; if (RG.GetRnd(3) == 0) len = 1 + GetLen1(); else { do Rep0 = GetOffset(); while (Rep0 >= Pos); Rep0++; len = 2 + GetLen2(); } for (int i = 0; i < len && Pos < BufferSize; i++, Pos++) Buffer[Pos] = Buffer[Pos - Rep0]; } } }
int GetLen2() { return RG.GetRnd(2 + (int) RG.GetRnd(2)); }
int GetLen1() { return RG.GetRnd(1 + (int) RG.GetRnd(2)); }
int GetOffset() { if (GetRndBit() == 0) return GetLogRandBits(4); return (GetLogRandBits(4) << 10) | RG.GetRnd(10); }
int GetLogRandBits(int numBits) { int len = RG.GetRnd(numBits); return RG.GetRnd((int) len); }
int GetRndBit() { return RG.GetRnd(1); }