Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: Searching binary data

by Juerd (Abbot)
on Mar 14, 2002 at 17:20 UTC ( [id://151743]=note: print w/replies, xml ) Need Help??


in reply to Searching binary data

my $match = pack 'H*', '53005f00560045005200530049004f004e005f004' . '9004e0046004f0000000000bd04effe00000100'; open (FILE, 'foo') or die $!; while (<FILE>) { print "Found: $1, $2, $3, $4\n" while s/$match(\S{4})(\S{4})(\S{4})(\S{4})/; } close FILE;
(Warning: untested code.)

U28geW91IGNhbiBhbGwgcm90MTMgY
W5kIHBhY2soKS4gQnV0IGRvIHlvdS
ByZWNvZ25pc2UgQmFzZTY0IHdoZW4
geW91IHNlZSBpdD8gIC0tIEp1ZXJk

Replies are listed 'Best First'.
Re: Re: Searching binary data
by theorbtwo (Prior) on Mar 14, 2002 at 17:55 UTC

    I think you want ".", rather then "\S" in your regex. Also, I think your matching code will miss cases where there is more then one match per line.

    However, the basic idea of packing is exactly what you want. You also probably want to use ord and printf %x to print your results in hex. (or unpack).


    We are using here a powerful strategy of synthesis: wishful thinking. -- The Wizard Book

      I think you want ".", rather then "\S" in your regex

      I copied that from the original post. I have no idea what sort of file is being used.

      Also, I think your matching code will miss cases where there is more then one match per line.

      The inner while (the statement modifier) takes care of that.

      U28geW91IGNhbiBhbGwgcm90MTMgY
      W5kIHBhY2soKS4gQnV0IGRvIHlvdS
      ByZWNvZ25pc2UgQmFzZTY0IHdoZW4
      geW91IHNlZSBpdD8gIC0tIEp1ZXJk
      

        Whoops, missed the statement modifer while; reading code too quickly while doing other things at the same time.

        As to using \S vs ., in your code it's matching arbitrary random data. In his, it's maching hex, so it's known nonspace.


        We are using here a powerful strategy of synthesis: wishful thinking. -- The Wizard Book

Re: Re: Searching binary data
by Shendal (Hermit) on Mar 14, 2002 at 19:05 UTC
    After some coersion, your response led me down the proper path. Here's my updated code snippet:
    my $match = pack 'H*', '53005f00560045005200530049004f004e005f004' . '9004e0046004f0000000000bd04effe00000100'; open(FILE,$file) or die $!; while (<FILE>) { if (/$match(\S{2})(\S{2})(\S{2})(\S{2})/) { print "Found match!"; print join('.',map {unpack 'H*',$_; } ($1,$2,$3,$4); } } close(FILE);
    I think my confusion rested in how perl would handle a binary file. Seems that the DWIM held true... I was making it harder than it was.

    Thanks for your help!

    Cheers,
    Shendal

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://151743]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2024-04-20 02:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found