Accessing file at bit level?

I want to access file at bit level such as
How many bit 0 are there in file?
How many bit 1 are there in file?
How many bit segment (such as 0,00,000,0000,1,11,111,1111...) are there in file?
Thank for your helping.
danh_phanAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
DanRollinsConnect With a Mentor Commented:
>>I think you can not convert large file to CString.

Sure you can.  But once it gets up around about 1/2 the size of the avialable memory, you will run into serious performance problems as the O/S begins swapping memory to disk.

I provided a simple (100-point) solution that will work for most situations.  I have presumed that you could use the source code of that tool as a starting point.  

It would be very easy to write a version of that tool that reads the file in smaller chunks and looks through those chunks for the target string.  Let that be your assignment.  I think it will be FUN for you!

-- Dan
0
 
ZoppoCommented:
Hi danh_phan,

here you can find a function which counts number of set bits in a long:
http://www.snippets.org/snippets/portable/BITCNT_1+C.php3

here you can find source how to use an array of chars as bit-array so
you can simply loop through the bits and count such segments:
http://www.snippets.org/snippets/portable/BITARRAY+C.php3

hope that helps,

ZOPPO
0
 
DanRollinsCommented:
The trick is to write a tool function that makes it easy to do a variety of things.  Then you can use existing tools to work out the rest of the task.

Here is a Function that converts the entire contents of a file into a series of '1's and '0's and places the output into a CString:

void ConvertFileTo1sAnd0s( LPCSTR sFilename, CString& sResult )
{
     CFile cFile( sFilename, CFile::modeRead );
     int nFileLen= cFile.GetLength();
     sResult= "";
     for (int j=0; j< nFileLen; j++ ) {
          BYTE c;
          char sz8bits[17];
          cFile.Read( &c, 1 );
          itoa( c, sz8bits, 2 );
          CString sTmp= sz8bits;
          while (sTmp.GetLength() < 8 ) {
               sTmp.Insert(0,'0');
          }
          sResult += sTmp;
     }
}
=-=-=-=-=-=-=-=-=-=-=-=-
Use it like this:

     CString s1sAnd0s;
     ConvertFileTo1sAnd0s( "c:\\temp\\test.bin", s1sAnd0s );

Then you can use CString member functions like:

int nOffset= s1sAnd0s.Find( "00000000000" );
if (nOffset == -1 ) {
     MessageBox("No strings of eleven 0's were found");
}

=-=-=-=-=-=-

-- Dan
0
 
danh_phanAuthor Commented:
How's about large file?
I think all source code here will not work properly if there are large files (~MB).
I think you can not convert large file to CString.
Thanks for your helping.

0
 
danh_phanAuthor Commented:
How's about large file?
I think all source code here will not work properly if there are large files (~MB).
I think you can not convert large file to CString.
Thanks for your helping.
I already this program, but it takes about 30 seconds for doing it (count all bit1 in 2MB file)
Thanks
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.