nisha has asked for the wisdom of the Perl Monks concerning the following question:

Dear Perl Monks, I have a problem w.r.t binary files. I can give a sample of my binary file since binary characters dont get printed on this editor. I have a binary file as below.
From: admin/mfe Subject: zip To: admin/mfe MIME-Version: 1.0 X-Mailer: WinNT's Blat ver 1.8.6e http://www.blat.net Content-Type: Multipart/Mixed; boundary=BlatBoundary-Yo7hjfnfSSAUIn61G +cd10 --BlatBoundary-Yo7hjfnfSSAUIn61Gcd10 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII Content-description: Mail message body This is a test file. --BlatBoundary-Yo7hjfnfSSAUIn61Gcd10 Content-Transfer-Encoding: binary Content-Type: application/msword; name=tryguard.DOC Content-Disposition: attachment; filename="tryguard.DOC" X-MCAFEE-GSD-Att: tryguard.DOC X-NAIMIME-Modified: 1 ÐÏࡱá binary contents in this area --BlatBoundary-Yo7hjfnfSSAUIn61Gcd10--
I have written a piece of code where i am supposed to be extracting everything after the string X-NAIMIME-Modified and the \n i.e from ÐÏࡱ till --BlatBoundary-Yo7hjfnfSSAUIn61Gcd10--. I am unable to do this because the pattern is not matching in the program i have written below. The extracted contents have to be written to another binary file. Below is the code.
#!/usr/bin/perl my $EServScanPath = "C:/Program Files/McAfee/Secure Messaging for Domi +no/bin/EservicesScanner/ScanOut_1.log"; my $CSEFile = "c:/Analysis/CSE/test.com"; print "The install path : $EServScanPath \n"; CreateCSESample(); sub CreateCSESample() { open FR, "<$EServScanPath" or die "Cannot open $EServScanPath \n"; open FW, ">>$CSEFile" or die "Cannot open $CSEFile \n"; binmode FR; binmode FW; my $buffer; while (read(FR,$buffer,1024)) { if ($buffer =~ /^X-NAIMIME-Modified/) { print "Nothing to be printed in the file \n"; } } close(FR); close(FW); }
Please help me with this problem. However on giving
if ($buffer =~ /^30582/) { print "nothing to be printed" }
The pattern is matched. Since it begins with 30582 in the file. Please help me.

Replies are listed 'Best First'.
Re: Help on binary files needed
by bart (Canon) on Apr 18, 2006 at 07:20 UTC
    This looks like a MIME encoded email message to me, so the best thing to do, IMO, would be to use a MIME parsing module.

    The next best thing is to extract the boundary from the Content-Type header, in this case "BlatBoundary-Yo7hjfnfSSAUIn61G" — but it'll be different every time; and use this as a pattern to split up the message, something like

    /^--\Q$boundary\E$/
    (or /^--\Q$boundary\E$/m if this is to be used with split)

    I'm not 100% sure that is how a MIME message is split up.

    And if Blat creates mail messages with binary files embedded, that would be enough reason for me not to use it any more. One day, it'll blow up in your face, as I'm sure it's legal for mail programs to treat the contents as plain text — thus: changing of the line ending byte sequence is allowed. You can create, and mail, using one of several methods, MIME messages with MIME::Lite.

Re: Help on binary files needed
by Anonymous Monk on Apr 18, 2006 at 09:38 UTC