compblock.cpp
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:4k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <compblock.h>
  3. //#include <mmintrin.h>
  4. //#include <xmmintrin.h>
  5. namespace CompMasks {
  6. const UINT32 NumMasks = 31;
  7. UINT32 masks[CompMasks::NumMasks] =
  8. {
  9. 1, 3, 7, 15, 31, 63, 127, 255,
  10. 511, 1023, 2047, 4095, 8191, 16383,
  11. 32767, 65535, 131072, 262144,
  12. 524288, 1048576, 2097152, 4194304,
  13. 8388608, 16777216, 33554432, 67108864,
  14. 134217728, 268435456, 536870912,
  15. 1073741824, 2147483648
  16. };
  17. };
  18. CompBlock::CompBlock(void)
  19. {
  20. InitBlock();
  21. }
  22. CompBlock::CompBlock(UINT32 length, unsigned char * ptr)
  23. {
  24. InitBlock();
  25. SetData(length,ptr);
  26. }
  27. CompBlock::~CompBlock(void)
  28. {
  29. }
  30. UINT32 CompBlock::CalculateMinBits(UINT32 num)
  31. {
  32. UINT32 bits = 1;
  33. UINT32 i = 0;
  34. UINT32 found = 0;
  35. while (!found){
  36. if ((num > CompMasks::masks[i]) && (i < CompMasks::NumMasks))
  37. {
  38. bits++;
  39. i++;
  40. }
  41. else
  42. {
  43. found++;
  44. }
  45. }
  46. return bits;
  47. }
  48. void CompBlock::SetData(UINT32 length, unsigned char * ptr)
  49. {
  50. InitBlock();
  51. m_bits = ptr;
  52. m_length = length;
  53. }
  54. void CompBlock::PopNumber(UINT32 num_bits, short& num)
  55. {
  56. if (!m_popped)
  57. {
  58. m_popped++;
  59. m_current_bit = 0;
  60. }
  61. if (m_bits)
  62. {
  63. m_off = m_current_bit / 8;
  64. INT32 tmp = 0;
  65. unsigned char * tmp_ptr = (unsigned char *)&tmp;
  66. if ((m_off+3) < m_length)
  67. tmp_ptr[0] = m_bits[m_off+3];
  68. if ((m_off+2) < m_length)
  69. tmp_ptr[1] = m_bits[m_off+2];
  70. if ((m_off+1) < m_length)
  71. tmp_ptr[2] = m_bits[m_off+1];
  72. if (m_off < m_length)
  73. tmp_ptr[3] = m_bits[m_off];
  74. m_pre = m_current_bit - (m_off * 8);
  75. m_fol = 32 - m_pre - num_bits;
  76. tmp = tmp >> m_fol;
  77. num = (short)(tmp & CompMasks::masks[num_bits-1]);
  78. m_current_bit += num_bits;
  79. }
  80. }
  81. void CompBlock::PushNumber(UINT32 num_bits, short num)
  82. {
  83. if (!m_pushed)
  84. {
  85. m_pushed++;
  86. m_current_bit = 0;
  87. }
  88. UINT32 final_bit = (m_current_bit + num_bits);
  89. UINT32 final_byte = (final_bit/8) + ((final_bit%8) ? 1 : 0);
  90. if (final_byte <= m_length)
  91. {
  92. m_bucket = num;
  93. m_bucket &= CompMasks::masks[num_bits-1];
  94. m_off = m_current_bit/8;
  95. m_pre = m_current_bit - (m_off * 8);
  96. m_fol = 32 - m_pre - num_bits;
  97. m_bucket = m_bucket << m_fol;
  98. char * cptr = (char *)&m_bucket;
  99. m_bits[m_off+3] |= cptr[0];
  100. m_bits[m_off+2] |= cptr[1];
  101. m_bits[m_off+1] |= cptr[2];
  102. m_bits[m_off] |= cptr[3];
  103. m_current_bit += num_bits;
  104. }
  105. }
  106. void CompBlock::PushNumber(UINT32 num_bits, UINT32 num)
  107. {
  108. if (!m_pushed)
  109. {
  110. m_pushed++;
  111. m_current_bit = 0;
  112. }
  113. UINT32 final_bit = (m_current_bit + num_bits);
  114. UINT32 final_byte = (final_bit/8) + ((final_bit%8) ? 1 : 0);
  115. if (final_byte <= m_length)
  116. {
  117. m_bucket = num;
  118. m_bucket &= CompMasks::masks[num_bits-1];
  119. m_off = m_current_bit/8;
  120. m_pre = m_current_bit - (m_off * 8);
  121. m_fol = 32 - m_pre - num_bits;
  122. m_bucket = m_bucket << m_fol;
  123. char * cptr = (char *)&m_bucket;
  124. m_bits[m_off+3] |= cptr[0];
  125. m_bits[m_off+2] |= cptr[1];
  126. m_bits[m_off+1] |= cptr[2];
  127. m_bits[m_off] |= cptr[3];
  128. m_current_bit += num_bits;
  129. }
  130. }
  131. void CompBlock::PushNumber(UINT32 num_bits, unsigned char num)
  132. {
  133. if (!m_pushed)
  134. {
  135. m_pushed++;
  136. m_current_bit = 0;
  137. }
  138. UINT32 final_bit = (m_current_bit + num_bits);
  139. UINT32 final_byte = (final_bit/8) + ((final_bit%8) ? 1 : 0);
  140. if (final_byte <= m_length)
  141. {
  142. m_bucket = num;
  143. m_bucket &= CompMasks::masks[num_bits-1];
  144. m_off = m_current_bit/8;
  145. m_pre = m_current_bit - (m_off * 8);
  146. m_fol = 32 - m_pre - num_bits;
  147. m_bucket = m_bucket << m_fol;
  148. char * cptr = (char *)&m_bucket;
  149. m_bits[m_off+3] |= cptr[0];
  150. m_bits[m_off+2] |= cptr[1];
  151. m_bits[m_off+1] |= cptr[2];
  152. m_bits[m_off] |= cptr[3];
  153. m_current_bit += num_bits;
  154. }
  155. }
  156. UINT32 CompBlock::GetCompressedSize(void)const
  157. {
  158. UINT32 result = (m_current_bit/8) + ((m_current_bit%8) ? 1 : 0);
  159. return result;
  160. }