Newbie: Better way to check a magic number on a file?

W

Wes Gamble

All,

I am trying to determine if I am dealing with an Excel file that I
upload to a Web server.

Here is the first test - to verify the magic number of the file that I
have:

#Check the magic number first to see if it's even an Office file

magic_number = nil
File.open(path_to_file, "r") do |f|
magic_number = f.read(6)
end
return false unless
magic_number.unpack('H*').to_s().eql?('d0cf11e0a1b1')

This seems a little bit less than optimal. I have to unpack my string
into an array and then reconvert it back to a string to compare it?

Surely there is a simpler way?

Should magic_number.eql?('d0cf11e0a1b1') work?

Wes
 
W

Wes Gamble

magic_number.eql?('d0cf11e0a1b1') doesn't work which kind of makes
sense.

Anyhow, is this the best way to do it? It feels very hokey to me :).

Thanks for the patience as well - I rarely inspect magic numbers...

WG
 
M

Mike Stok

All,

I am trying to determine if I am dealing with an Excel file that I
upload to a Web server.

Here is the first test - to verify the magic number of the file that I
have:

#Check the magic number first to see if it's even an Office file

magic_number = nil
File.open(path_to_file, "r") do |f|
magic_number = f.read(6)
end
return false unless
magic_number.unpack('H*').to_s().eql?('d0cf11e0a1b1')

This seems a little bit less than optimal. I have to unpack my string
into an array and then reconvert it back to a string to compare it?

Surely there is a simpler way?

Should magic_number.eql?('d0cf11e0a1b1') work?

There are a number of simpler ways, one might be

EXCEL_FILE_MAGIC_NUMBER = ['d0cf11e0a1b1'].pack('H*')

# later

magic_number == EXCEL_FILE_MAGIC_NUMBER # => true or false

or you can use octal or hex escapes to have a string literal to
compare against e.g.

irb(main):006:0> "\320\317\021\340\241\261" == "\xd0\xcf\x11\xe0\xa1
\xb1"
=> true

Maybe there are good bits of the Pickaxe (Programming Ruby) or some
on-line tutorials which can help you see some of the more ruby-ish
ways to do things.

Hope this helps,

Mike

--

Mike Stok <[email protected]>
http://www.stok.ca/~mike/

The "`Stok' disclaimers" apply.
 
W

Wes Gamble

An even better way would be to take advantage of the fact that I'm
uploading through a browser and just look at the MIME type

:) :) :)

Man, I'm dumb :).

But on the other hand, now I now about the IO module, and modules in
general and all kinds of things.

Thanks, everybody.

Wes

Mike said:
magic_number = nil

Should magic_number.eql?('d0cf11e0a1b1') work?

There are a number of simpler ways, one might be

EXCEL_FILE_MAGIC_NUMBER = ['d0cf11e0a1b1'].pack('H*')

# later

magic_number == EXCEL_FILE_MAGIC_NUMBER # => true or false

or you can use octal or hex escapes to have a string literal to
compare against e.g.

irb(main):006:0> "\320\317\021\340\241\261" == "\xd0\xcf\x11\xe0\xa1
\xb1"
=> true

Maybe there are good bits of the Pickaxe (Programming Ruby) or some
on-line tutorials which can help you see some of the more ruby-ish
ways to do things.

Hope this helps,

Mike

--

Mike Stok <[email protected]>
http://www.stok.ca/~mike/

The "`Stok' disclaimers" apply.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,902
Latest member
Elena68X5

Latest Threads

Top