Advertisement
Guest User

Arch

a guest
Dec 18th, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.00 KB | None | 0 0
  1. „. Œ áâà¢, "Œ®­¨â®à", N1, 1994.
  2.  
  3. €«£®à¨â¬ë ᦠâ¨ï ¨­ä®à¬ 樨
  4.  
  5. — áâì 2. €à¨ä¬¥â¨ç¥áª®¥ ª®¤¨à®¢ ­¨¥
  6.  
  7. ‹¨á⨭£
  8.  
  9. /*
  10.  €¤ ¯â¨¢­®¥  à¨ä¬¥â¨ç¥áª®¥ ª®¤¨à®¢ ­¨¥.
  11.  „¥¬®­áâà ⨢­ ï ¯à®£à ¬¬ .
  12.  Š®¬¯¨«ïæ¨ï ¤«ï Borland:
  13.    - bcc ar.c
  14.  ˆá¯®«ì§®¢ ­¨¥:
  15.    ar e(ncode)|d(ecode) infile outfile
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <process.h>
  20.  
  21. // Š®«¨ç¥á⢮ ¡¨â®¢ ¢ ॣ¨áâà¥
  22. #define BITS_IN_REGISTER 16
  23.  
  24. // Œ ªá¨¬ «ì­® ¢®§¬®¦­®¥ §­ 祭¨¥ ¢ ॣ¨áâà¥
  25. #define TOP_VALUE (((long) 1 << BITS_IN_REGISTER) - 1)
  26.  
  27. // „¨ ¯ §®­ë
  28. #define FIRST_QTR (TOP_VALUE / 4 + 1)
  29. #define HALF      (2 * FIRST_QTR)
  30. #define THIRD_QTR (3 * FIRST_QTR)
  31.  
  32. // Š®«¨ç¥á⢮ ᨬ¢®«®¢  «ä ¢¨â
  33. #define NO_OF_CHARS 256
  34. // ‘¯¥æ¨ «ì­ë© ᨬ¢®« Š®­¥æ” ©«
  35. #define EOF_SYMBOL    (NO_OF_CHARS + 1)
  36. // ‚ᥣ® ᨬ¢®«®¢ ¢ ¬®¤¥«¨
  37. #define NO_OF_SYMBOLS (NO_OF_CHARS + 1)
  38.  
  39. // ®à®£ ç áâ®âë ¤«ï ¬ áèâ ¡¨à®¢ ­¨ï
  40. #define MAX_FREQUENCY 16383
  41.  
  42. // ’ ¡«¨æë ¯¥à¥ª®¤¨à®¢ª¨
  43. unsigned char         index_to_char [NO_OF_SYMBOLS];
  44. int                   char_to_index [NO_OF_CHARS];
  45.  
  46. // ’ ¡«¨æë ç áâ®â
  47. int                   cum_freq [NO_OF_SYMBOLS + 1];
  48. int                   freq [NO_OF_SYMBOLS + 1];
  49.  
  50. // ¥£¨áâàë £à ­¨æ ¨ ª®¤
  51. long                  low, high;
  52. long                  value;
  53.  
  54. // ®¤¤¥à¦ª  ¯®¡¨â«¢ëå ®¯¥à 権 á ä ©« ¬¨
  55. long                  bits_to_follow;
  56. int                   buffer;
  57. int                   bits_to_go;
  58. int                   garbage_bits;
  59.  
  60. // Ž¡à ¡ âë¢ ¥¬ë¥ ä ©«ë
  61.  
  62. FILE *in, *out;
  63.  
  64. //------------------------------------------------------------
  65. // ˆ­¨æ¨ «¨§ æ¨ï  ¤ ¯â¨¢­®© ¬®¤¥«¨
  66.  
  67. void start_model (void)
  68. {
  69.   int i;
  70.  
  71.   for ( i = 0; i < NO_OF_CHARS; i++)
  72.   {
  73.     char_to_index [i] = i + 1;
  74.     index_to_char [i + 1] = i;
  75.   }
  76.   for ( i = 0; i <= NO_OF_SYMBOLS; i++)
  77.   {
  78.     freq [i] = 1;
  79.     cum_freq [i] = NO_OF_SYMBOLS - i;
  80.   }
  81.   freq [0] = 0;
  82. }
  83.  
  84. //------------------------------------------------------------
  85. // Ž¡­®¢«¥­¨¥ ¬®¤¥«¨ ®ç¥à¥¤­ë¬ ᨬ¢®«®¬
  86.  
  87. void update_model ( int symbol)
  88. {
  89.   int i;
  90.   int ch_i, ch_symbol;
  91.   int cum;
  92.  
  93.   // ¯à®¢¥àª  ­  ¯¥à¥¯®«­¥­¨¥ áç¥â稪  ç áâ®âë
  94.   if (cum_freq [0] == MAX_FREQUENCY)
  95.   {
  96.     cum = 0;
  97.     // ¬ áèâ ¡¨à®¢ ­¨¥ ç áâ®â ¯à¨ ¯¥à¥¯®«­¥­¨¨
  98.     for ( i = NO_OF_SYMBOLS; i >= 0; i--)
  99.     {
  100.       freq [i] = (freq [i] + 1) / 2;
  101.       cum_freq [i] = cum;
  102.       cum += freq [i];
  103.     }
  104.   }
  105.   for ( i = symbol; freq [i] == freq [i - 1]; i--);
  106.   if (i < symbol)
  107.   {
  108.     ch_i                      = index_to_char [i];
  109.     ch_symbol                 = index_to_char [symbol];
  110.     index_to_char [i]         = ch_symbol;
  111.     index_to_char [symbol]    = ch_i;
  112.     char_to_index [ch_i]      = symbol;
  113.     char_to_index [ch_symbol] = i;
  114.   }
  115.   // ®¡­®¢«¥­¨¥ §­ 祭¨© ¢ â ¡«¨æ å ç áâ®â
  116.   freq [i] += 1;
  117.   while (i > 0)
  118.   {
  119.     i -= 1;
  120.     cum_freq [i] += 1;
  121.   }
  122. }
  123.  
  124. //------------------------------------------------------------
  125. // ˆ­¨æ¨ «¨§ æ¨ï ¯®¡¨â®¢®£® ¢¢®¤
  126.  
  127. void start_inputing_bits (void)
  128. {
  129.   bits_to_go = 0;
  130.   garbage_bits = 0;
  131. }
  132.  
  133. //------------------------------------------------------------
  134. // ‚¢®¤ ®ç¥à¥¤­®£® ¡¨â  á¦ ⮩ ¨­ä®à¬ 樨
  135.  
  136. int input_bit (void)
  137. {
  138.   int t;
  139.  
  140.   if (bits_to_go == 0)
  141.   {
  142.     buffer = getc (in);
  143.     if (buffer == EOF)
  144.     {
  145.       garbage_bits += 1;
  146.       if (garbage_bits > BITS_IN_REGISTER - 2)
  147.       {
  148.         printf ("Žè¨¡ª  ¢ ᦠ⮬ ä ©«¥\n");
  149.         exit (-1);
  150.       }
  151.     }
  152.     bits_to_go = 8;
  153.   }
  154.   t = buffer & 1;
  155.   buffer >>= 1;
  156.   bits_to_go -= 1;
  157.   return t;
  158. }
  159.  
  160. //------------------------------------------------------------
  161. // ˆ­¨æ¨ «¨§ æ¨ï ¯®¡¨â®¢®£® ¢ë¢®¤
  162.  
  163. void start_outputing_bits (void)
  164. {
  165.   buffer = 0;
  166.   bits_to_go = 8;
  167. }
  168.  
  169. //------------------------------------------------------------
  170. // ‚뢮¤ ®ç¥à¥¤­®£® ¡¨â  á¦ ⮩ ¨­ä®à¬ 樨
  171.  
  172. void output_bit ( int bit)
  173. {
  174.   buffer >>= 1;
  175.   if (bit)
  176.     buffer |= 0x80;
  177.   bits_to_go -= 1;
  178.   if (bits_to_go == 0)
  179.   {
  180.     putc ( buffer, out);
  181.     bits_to_go = 8;
  182.   }
  183. }
  184.  
  185. //------------------------------------------------------------
  186. // Žç¨á⪠ ¡ãä¥à  ¯®¡¨â®¢®£® ¢ë¢®¤
  187.  
  188. void done_outputing_bits (void)
  189. {
  190.   putc ( buffer >> bits_to_go, out);
  191. }
  192.  
  193. //------------------------------------------------------------
  194. // ‚뢮¤ 㪠§ ­­®£® ¡¨â  ¨ ®â«®¦¥­­ëå à ­¥¥
  195.  
  196. void output_bit_plus_follow ( int bit)
  197. {
  198.   output_bit (bit);
  199.   while (bits_to_follow > 0)
  200.   {
  201.     output_bit (!bit);
  202.     bits_to_follow--;
  203.   }
  204. }
  205.  
  206. //------------------------------------------------------------
  207. // ˆ­¨æ¨ «¨§ æ¨ï ॣ¨áâ஢ £à ­¨æ ¨ ª®¤  ¯¥à¥¤ ­ ç «®¬ ᦠâ¨ï
  208.  
  209. void start_encoding (void)
  210. {
  211.   low            = 0l;
  212.   high           = TOP_VALUE;
  213.   bits_to_follow = 0l;
  214. }
  215.  
  216. //------------------------------------------------------------
  217. // Žç¨á⪠ ¯®¡¨â®¢®£® ¢ë¢®¤
  218.  
  219. void done_encoding (void)
  220. {
  221.   bits_to_follow++;
  222.   if (low < FIRST_QTR)
  223.     output_bit_plus_follow (0);
  224.   else
  225.     output_bit_plus_follow (1);
  226. }
  227.  
  228. //------------------------------------------------------------
  229. /* ˆ­¨æ¨ «¨§ æ¨ï ॣ¨áâ஢ ¯¥à¥¤ ¤¥ª®¤¨à®¢ ­¨¥¬.
  230.    ‡ £à㧪  ­ ç «  á¦ ⮣® á®®¡é¥­¨ï
  231. */
  232.  
  233. void start_decoding (void)
  234. {
  235.   int i;
  236.  
  237.   value = 0l;
  238.   for ( i = 1; i <= BITS_IN_REGISTER; i++)
  239.     value = 2 * value + input_bit ();
  240.   low = 0l;
  241.   high = TOP_VALUE;
  242. }
  243.  
  244. //------------------------------------------------------------
  245. // Š®¤¨à®¢ ­¨¥ ®ç¥à¥¤­®£® ᨬ¢®«
  246.  
  247. void encode_symbol ( int symbol)
  248. {
  249.   long range;
  250.  
  251.   // ¯¥à¥áç¥â §­ 祭¨© £à ­¨æ
  252.   range = (long) (high - low) + 1;
  253.   high = low + (range * cum_freq [symbol - 1]) / cum_freq [0] - 1;
  254.   low = low + (range * cum_freq [symbol]) / cum_freq [0];
  255.   // ¢ë¤¢¨£ ­¨¥ ®ç¥à¥¤­ëå ¡¨â®¢
  256.   for (;;)
  257.   {
  258.     if (high < HALF)
  259.       output_bit_plus_follow (0);
  260.     else if (low >= HALF)
  261.     {
  262.       output_bit_plus_follow (1);
  263.       low -= HALF;
  264.       high -= HALF;
  265.     }
  266.     else if (low >= FIRST_QTR && high < THIRD_QTR)
  267.     {
  268.       bits_to_follow += 1;
  269.       low -= FIRST_QTR;
  270.       high -= FIRST_QTR;
  271.     }
  272.     else
  273.       break;
  274.     // ᤢ¨£ ¢«¥¢® á "¢â¢ ­¨¥¬" ®ç¥à¥¤­®£® ¡¨â
  275.     low = 2 * low;
  276.     high = 2 * high + 1;
  277.   }
  278. }
  279.  
  280. //------------------------------------------------------------
  281. // „¥ª®¤¨à®¢ ­¨¥ ®ç¥à¥¤­®£® ᨬ¢®«
  282.  
  283. int decode_symbol (void)
  284. {
  285.   long range;
  286.   int cum, symbol;
  287.  
  288.   // ®¯à¥¤¥«¥­¨¥ ⥪ã饣® ¬ áèâ ¡  ç áâ®â
  289.   range = (long) (high - low) + 1;
  290.   // ¬ áèâ ¡¨à®¢ ­¨¥ §­ 祭¨ï ¢ ॣ¨áâॠª®¤
  291.   cum = (int)
  292.     ((((long) (value - low) + 1) * cum_freq [0] - 1) / range);
  293.   // ¯®¨áª ᮮ⢥âáâ¢ãî饣® ᨬ¢®«  ¢ â ¡«¨æ¥ ç áâ®â
  294.   for (symbol = 1; cum_freq [symbol] > cum; symbol++);
  295.   // ¯¥à¥áç¥â £à ­¨æ
  296.   high = low + (range * cum_freq [symbol - 1]) / cum_freq [0] - 1;
  297.   low = low + (range * cum_freq [symbol]) / cum_freq [0];
  298.   // 㤠«¥­¨¥ ®ç¥à¥¤­®£® ᨬ¢®«  ¨§ ¢å®¤­®£® ¯®â®ª
  299.   for (;;)
  300.   {
  301.     if (high < HALF)
  302.     {
  303.     }
  304.     else if (low >= HALF)
  305.     {
  306.       value -= HALF;
  307.       low -= HALF;
  308.       high -= HALF;
  309.     }
  310.     else if (low >= FIRST_QTR && high < THIRD_QTR)
  311.     {
  312.       value -= FIRST_QTR;
  313.       low -= FIRST_QTR;
  314.       high -= FIRST_QTR;
  315.     }
  316.     else
  317.       break;
  318.     // ᤢ¨£ ¢«¥¢® á "¢â¢ ­¨¥¬ ®ç¥à¥¤­®£® ¡¨â
  319.     low = 2 * low;
  320.     high = 2 * high + 1;
  321.     value = 2 * value + input_bit ();
  322.   }
  323.   return symbol;
  324. }
  325.  
  326. //------------------------------------------------------------
  327. // ‘®¡á⢥­­®  ¤ ¯â¨¢­®¥  à¨ä¬¥â¨ç¥áª®¥ ª®¤¨à®¢ ­¨¥
  328.  
  329. void encode ( char *infile, char *outfile)
  330. {
  331.   int ch, symbol;
  332.  
  333.   in = fopen ( infile, "r+b");
  334.   out = fopen ( outfile, "w+b");
  335.   if (in == NULL || out == NULL)
  336.     return;
  337.   start_model ();
  338.   start_outputing_bits ();
  339.   start_encoding ();
  340.   for (;;)
  341.   {
  342.     ch = getc (in);
  343.     if (ch == EOF)
  344.       break;
  345.     symbol = char_to_index [ch];
  346.     encode_symbol (symbol);
  347.     update_model (symbol);
  348.   }
  349.   encode_symbol (EOF_SYMBOL);
  350.   done_encoding ();
  351.   done_outputing_bits ();
  352.   fclose (in);
  353.   fclose (out);
  354. }
  355.  
  356. //------------------------------------------------------------
  357. // ‘®¡á⢥­­®  ¤ ¯â¨¢­®¥  à¨ä¬¥â¨ç¥áª®¥ ¤¥ª®¤¨à®¢ ­¨¥
  358.  
  359. void decode ( char *infile, char *outfile)
  360. {
  361.   int ch, symbol;
  362.  
  363.   in = fopen ( infile, "r+b");
  364.   out = fopen ( outfile, "w+b");
  365.   if (in == NULL || out == NULL)
  366.     return;
  367.   start_model ();
  368.   start_inputing_bits ();
  369.   start_decoding ();
  370.   for (;;)
  371.   {
  372.     symbol = decode_symbol ();
  373.     if (symbol == EOF_SYMBOL)
  374.       break;
  375.     ch = index_to_char [symbol];
  376.     putc ( ch, out);
  377.     update_model (symbol);
  378.   }
  379.   fclose (in);
  380.   fclose (out);
  381. }
  382.  
  383. //------------------------------------------------------------
  384. // ƒ®«®¢­ ï ¯à®æ¥¤ãà
  385.  
  386. void main ( int argc, char **argv)
  387. {
  388.   if (argc < 4)
  389.   {
  390.     printf ("\nˆá¯®«ì§®¢ ­¨¥: ar e|d infile outfile\n");
  391.     exit (0);
  392.   }
  393.   if (argv [1] [0] == 'e')
  394.     encode ( argv [2], argv [3]);
  395.   else if (argv [1] [0] == 'd')
  396.     decode ( argv [2], argv [3]);
  397.   exit (0);
  398. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement