Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/etc/Divers/FileNb255.cpp

Go to the documentation of this file.
00001 // Standard J2K Library
00002 // LGPL licensed.
00003 // http://j2k.sourceforge.net/
00004 
00005 #ifndef __J2K__FileNb255_CPP__
00006 #define __J2K__FileNb255_CPP__
00007 /*
00008 > Aurélien patard wrote in message <91autf$4fj$1@wanadoo.fr>...
00009 > >Quelle est la meilleure méthode pour compresser un fichier qui contient une
00010 > >suite de nombres inferieurs ou egaux a 255 et seulement quelques nombres
00011 > >supérieurs à 255.
00012 > >Si vous pouvez accompagner votre explication par un source
00013 > >cela serait parfait.
00014 > >Merci d'avance.
00015 > 
00016 > Commence par le stocké en binaire avec une section char.
00017 > Si le char = 255 alors c'est un doublé
00018 > 255+next char
00019 > 
00020 > Donc 255+254 = 509 est le plus grand nombre.
00021 > 
00022 > La première chose est d'ouvrir ton fichier avec fopen( file, "rb" ) ou "wb"
00023 > Read/Write Binary
00024 > et tu lis 4096 octets que tu stock dans un buffer, puis
00025 > tu traite le fichier en mémoire.
00026 > 
00027 > Essaie, 2K, 4K, 8K, 16K ou 32K dépendamment de la machine ça va plus vite.
00028 > 
00029 > Si t'as moins de 4K, lit 4K pareil et il va lire moins.... (jusqu'à max 4K)
00030 > 
00031 > Sinon met tous en short, c'est moins compliqué.
00032 > 
00033 > À part ça, tu peux regarder les arbres de huffman.
00034 > 
00035 > Huffman trees.
00036 > 
00037 > http://j2k.sourceforge.net/src/j2k/Fred/DataBase/Huffman/
00038 > 
00039 > Bien à vous,
00040 > 
00041 > Fred.
00042 */
00043 
00044 #include <stdio.h>
00045 #include <stdlib.h>
00046 #include <string.h>
00047 
00048 #define MAX    80
00049 #define UCHAR  unsigned char
00050 #define USHORT unsigned short
00051 
00052 short  table[ MAX ];
00053 char   buffer[ MAX * 2 ];
00054 size_t length = 0;
00055 
00056 void save() 
00057 {
00058   register unsigned short i = 0;
00059   register unsigned char  c = NULL;
00060   register unsigned short pos = 0;
00061   memset( buffer, 0, MAX );
00062   for( i = 0; i < MAX; i++ ) 
00063   {
00064     if ( table[ i ] < 255 ) {
00065       c = (UCHAR)table[ i ];
00066       buffer[ pos ] = c;
00067       pos++;
00068     } else if ( table[ i ] < 510 ) {
00069       c = (UCHAR)(table[ i ] - 255);
00070       buffer[ pos ] = 255;
00071       pos++;
00072       buffer[ pos ] = c;
00073       pos++;
00074     } else {
00075       printf( "Error: Number too big." );
00076     }
00077   } 
00078   length = pos;
00079 }
00080 
00081 void load() 
00082 {
00083   register unsigned short i = 0;
00084   register unsigned char  c = NULL;
00085   register unsigned short pos = 0;
00086   memset( buffer, 0, MAX );
00087   for( i = 0; i < MAX; i++ ) 
00088   {
00089     c = (UCHAR)buffer[ pos ];
00090     pos++;
00091     if ( c < 255 ) {
00092       table[ i ] = (USHORT)c;
00093     } else if ( c == 255 ) {
00094       c = (UCHAR)buffer[ pos ];
00095       pos++;
00096       table[ i ] = (USHORT)c;
00097     } else {
00098       printf( "Error: Number too big." );
00099     }
00100   } 
00101   length = pos;
00102 }
00103 
00104 #undef UCHAR
00105 #undef USHORT
00106 
00107 #include <j2k/Fred/JFile.cpp>
00108 
00109 /* http://j2k.sourceforge.net/src/j2k/Fred/JFile.cpp
00110 */
00111 
00112 void toDisk() 
00113 {
00114 JFile myFile( "number.txt", "wb" );
00115  myFile.putData( buffer, length );
00116 }
00117 
00118 void fromDisk() 
00119 {
00120 JFile myFile( "number.txt", "rb" );
00121  myFile.putData( buffer, MAX*2 );
00122 }
00123 
00124 void test() 
00125 {
00126   register unsigned short i = 0;
00127   for( i = 0; i < MAX; i++ ) {
00128     table[ i ] = (i+200) % 300;
00129   }
00130 
00131   save();
00132   toDisk();
00133  
00134   fromDisk();
00135   load();
00136 
00137   for( i = 0; i < MAX; i++ ) {
00138     printf( "[%d]\t", table[ i ] );
00139   }
00140 
00141 }
00142 
00143 // Hope it helps !
00144 
00145 // Fred.
00146 
00147 #endif
00148 
00149 
00150 
00151 
00152 
00153 

Generated on Sun Oct 14 18:46:31 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001