123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- using SharpCompress.Compressors.Rar.VM;
- namespace SharpCompress.Compressors.Rar.UnpackV1
- {
- internal static class UnpackUtility
- {
- internal static uint DecodeNumber(this BitInput input, Decode.Decode dec) {
- return (uint)input.decodeNumber(dec);
- }
- internal static int decodeNumber(this BitInput input, Decode.Decode dec)
- {
- int bits;
- long bitField = input.GetBits() & 0xfffe;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int[] decodeLen = dec.DecodeLen;
- if (bitField < decodeLen[8])
- {
- if (bitField < decodeLen[4])
- {
- if (bitField < decodeLen[2])
- {
- if (bitField < decodeLen[1])
- {
- bits = 1;
- }
- else
- {
- bits = 2;
- }
- }
- else
- {
- if (bitField < decodeLen[3])
- {
- bits = 3;
- }
- else
- {
- bits = 4;
- }
- }
- }
- else
- {
- if (bitField < decodeLen[6])
- {
- if (bitField < decodeLen[5])
- {
- bits = 5;
- }
- else
- {
- bits = 6;
- }
- }
- else
- {
- if (bitField < decodeLen[7])
- {
- bits = 7;
- }
- else
- {
- bits = 8;
- }
- }
- }
- }
- else
- {
- if (bitField < decodeLen[12])
- {
- if (bitField < decodeLen[10])
- {
- if (bitField < decodeLen[9])
- {
- bits = 9;
- }
- else
- {
- bits = 10;
- }
- }
- else if (bitField < decodeLen[11])
- {
- bits = 11;
- }
- else
- {
- bits = 12;
- }
- }
- else
- {
- if (bitField < decodeLen[14])
- {
- if (bitField < decodeLen[13])
- {
- bits = 13;
- }
- else
- {
- bits = 14;
- }
- }
- else
- {
- bits = 15;
- }
- }
- }
- input.AddBits(bits);
- int N = dec.DecodePos[bits] + (Utility.URShift(((int)bitField - decodeLen[bits - 1]), (16 - bits)));
- if (N >= dec.MaxNum)
- {
- N = 0;
- }
- return (dec.DecodeNum[N]);
- }
- internal static void makeDecodeTables(byte[] lenTab, int offset, Decode.Decode dec, int size)
- {
- int[] lenCount = new int[16];
- int[] tmpPos = new int[16];
- int i;
- long M, N;
- Utility.Fill(lenCount, 0);
- Utility.Fill(dec.DecodeNum, 0);
- for (i = 0; i < size; i++)
- {
- lenCount[lenTab[offset + i] & 0xF]++;
- }
- lenCount[0] = 0;
- for (tmpPos[0] = 0, dec.DecodePos[0] = 0, dec.DecodeLen[0] = 0, N = 0, i = 1; i < 16; i++)
- {
- N = 2 * (N + lenCount[i]);
- M = N << (15 - i);
- if (M > 0xFFFF)
- {
- M = 0xFFFF;
- }
- dec.DecodeLen[i] = (int)M;
- tmpPos[i] = dec.DecodePos[i] = dec.DecodePos[i - 1] + lenCount[i - 1];
- }
- for (i = 0; i < size; i++)
- {
- if (lenTab[offset + i] != 0)
- {
- dec.DecodeNum[tmpPos[lenTab[offset + i] & 0xF]++] = i;
- }
- }
- dec.MaxNum = size;
- }
- }
- }
|