UnpackUtility.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using SharpCompress.Compressors.Rar.VM;
  2. namespace SharpCompress.Compressors.Rar.UnpackV1
  3. {
  4. internal static class UnpackUtility
  5. {
  6. //!!! TODO rename methods
  7. internal static uint DecodeNumber(this BitInput input, Decode.Decode dec) {
  8. return (uint)input.decodeNumber(dec);
  9. }
  10. internal static int decodeNumber(this BitInput input, Decode.Decode dec)
  11. {
  12. int bits;
  13. long bitField = input.GetBits() & 0xfffe;
  14. // if (bitField < dec.getDecodeLen()[8]) {
  15. // if (bitField < dec.getDecodeLen()[4]) {
  16. // if (bitField < dec.getDecodeLen()[2]) {
  17. // if (bitField < dec.getDecodeLen()[1]) {
  18. // bits = 1;
  19. // } else {
  20. // bits = 2;
  21. // }
  22. // } else {
  23. // if (bitField < dec.getDecodeLen()[3]) {
  24. // bits = 3;
  25. // } else {
  26. // bits = 4;
  27. // }
  28. // }
  29. // } else {
  30. // if (bitField < dec.getDecodeLen()[6]) {
  31. // if (bitField < dec.getDecodeLen()[5])
  32. // bits = 5;
  33. // else
  34. // bits = 6;
  35. // } else {
  36. // if (bitField < dec.getDecodeLen()[7]) {
  37. // bits = 7;
  38. // } else {
  39. // bits = 8;
  40. // }
  41. // }
  42. // }
  43. // } else {
  44. // if (bitField < dec.getDecodeLen()[12]) {
  45. // if (bitField < dec.getDecodeLen()[10])
  46. // if (bitField < dec.getDecodeLen()[9])
  47. // bits = 9;
  48. // else
  49. // bits = 10;
  50. // else if (bitField < dec.getDecodeLen()[11])
  51. // bits = 11;
  52. // else
  53. // bits = 12;
  54. // } else {
  55. // if (bitField < dec.getDecodeLen()[14]) {
  56. // if (bitField < dec.getDecodeLen()[13]) {
  57. // bits = 13;
  58. // } else {
  59. // bits = 14;
  60. // }
  61. // } else {
  62. // bits = 15;
  63. // }
  64. // }
  65. // }
  66. // addbits(bits);
  67. // int N = dec.getDecodePos()[bits]
  68. // + (((int) bitField - dec.getDecodeLen()[bits - 1]) >>> (16 - bits));
  69. // if (N >= dec.getMaxNum()) {
  70. // N = 0;
  71. // }
  72. // return (dec.getDecodeNum()[N]);
  73. int[] decodeLen = dec.DecodeLen;
  74. if (bitField < decodeLen[8])
  75. {
  76. if (bitField < decodeLen[4])
  77. {
  78. if (bitField < decodeLen[2])
  79. {
  80. if (bitField < decodeLen[1])
  81. {
  82. bits = 1;
  83. }
  84. else
  85. {
  86. bits = 2;
  87. }
  88. }
  89. else
  90. {
  91. if (bitField < decodeLen[3])
  92. {
  93. bits = 3;
  94. }
  95. else
  96. {
  97. bits = 4;
  98. }
  99. }
  100. }
  101. else
  102. {
  103. if (bitField < decodeLen[6])
  104. {
  105. if (bitField < decodeLen[5])
  106. {
  107. bits = 5;
  108. }
  109. else
  110. {
  111. bits = 6;
  112. }
  113. }
  114. else
  115. {
  116. if (bitField < decodeLen[7])
  117. {
  118. bits = 7;
  119. }
  120. else
  121. {
  122. bits = 8;
  123. }
  124. }
  125. }
  126. }
  127. else
  128. {
  129. if (bitField < decodeLen[12])
  130. {
  131. if (bitField < decodeLen[10])
  132. {
  133. if (bitField < decodeLen[9])
  134. {
  135. bits = 9;
  136. }
  137. else
  138. {
  139. bits = 10;
  140. }
  141. }
  142. else if (bitField < decodeLen[11])
  143. {
  144. bits = 11;
  145. }
  146. else
  147. {
  148. bits = 12;
  149. }
  150. }
  151. else
  152. {
  153. if (bitField < decodeLen[14])
  154. {
  155. if (bitField < decodeLen[13])
  156. {
  157. bits = 13;
  158. }
  159. else
  160. {
  161. bits = 14;
  162. }
  163. }
  164. else
  165. {
  166. bits = 15;
  167. }
  168. }
  169. }
  170. input.AddBits(bits);
  171. int N = dec.DecodePos[bits] + (Utility.URShift(((int)bitField - decodeLen[bits - 1]), (16 - bits)));
  172. if (N >= dec.MaxNum)
  173. {
  174. N = 0;
  175. }
  176. return (dec.DecodeNum[N]);
  177. }
  178. internal static void makeDecodeTables(byte[] lenTab, int offset, Decode.Decode dec, int size)
  179. {
  180. int[] lenCount = new int[16];
  181. int[] tmpPos = new int[16];
  182. int i;
  183. long M, N;
  184. Utility.Fill(lenCount, 0); // memset(LenCount,0,sizeof(LenCount));
  185. Utility.Fill(dec.DecodeNum, 0); // memset(Dec->DecodeNum,0,Size*sizeof(*Dec->DecodeNum));
  186. for (i = 0; i < size; i++)
  187. {
  188. lenCount[lenTab[offset + i] & 0xF]++;
  189. }
  190. lenCount[0] = 0;
  191. for (tmpPos[0] = 0, dec.DecodePos[0] = 0, dec.DecodeLen[0] = 0, N = 0, i = 1; i < 16; i++)
  192. {
  193. N = 2 * (N + lenCount[i]);
  194. M = N << (15 - i);
  195. if (M > 0xFFFF)
  196. {
  197. M = 0xFFFF;
  198. }
  199. dec.DecodeLen[i] = (int)M;
  200. tmpPos[i] = dec.DecodePos[i] = dec.DecodePos[i - 1] + lenCount[i - 1];
  201. }
  202. for (i = 0; i < size; i++)
  203. {
  204. if (lenTab[offset + i] != 0)
  205. {
  206. dec.DecodeNum[tmpPos[lenTab[offset + i] & 0xF]++] = i;
  207. }
  208. }
  209. dec.MaxNum = size;
  210. }
  211. }
  212. }