Forum: Ruby Cyclic redundancy check (CRC32) of a file

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Cf5d71d8e75f6cc9c9f3a481b339df59?d=identicon&s=25 Paul Golea (uddun)
on 2009-02-23 10:44
Hello,

I try to calculate the CRC32 of a file with a script ruby, but I does
not obtain the good result by comparison with many of the other software
which already make this (in other programming language...), for example:
http://www.codeproject.com/KB/recipes/crc32.aspx

I use this script :
_____________________

require 'zlib'
filetest = File.read 'image.jpg'
puts Zlib.crc32(filetest, 0).to_s(16).upcase
_____________________

The result looks like well of an CRC32 but it is never good...

I also try a pure ruby implementation with this code but it makes
exactly the zlib.crc32 result... :
_____________________

def crc32(c)
    n = c.length
    r = 0xFFFFFFFF
    n.times do |i|
        r ^= c[i]
        8.times do
            if (r & 1)!=0
                r = (r>>1) ^ 0xEDB88320
            else
                r >>= 1
            end
        end
    end
    r ^ 0xFFFFFFFF
end

filetest = File.read 'image.jpg'
puts crc32(filetest).to_s(16).upcase
_____________________


Thank you very much to the person who will have the solution of my
problem.
B57c5af36f5c1f33243dd8b2dd9043b1?d=identicon&s=25 F. Senault (Guest)
on 2009-02-23 11:06
(Received via mailing list)
Le 23 février 2009 à 10:44, Paul Golea a écrit :

> Thank you very much to the person who will have the solution of my
> problem.

If you are under Windows, you need to open the file in binary mode.
(Well, arguably, you always need to open binary files in binary mode).

For instance :

Z:\>ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

Z:\>irb
>> require "zlib"
=> true

>> f = File.read('bibi.jpg') ; nil
=> nil
>> Zlib.crc32(f,0).to_s(16)
=> "332c7941"

>> f = nil
=> nil
>> File.open('bibi.jpg', 'rb') { |h| f = h.read } ; nil
=> nil
>> Zlib.crc32(f,0).to_s(16)
=> "5ba68c3c"

And the second CRC corresponds to what other tools give me.

Fred
Cf5d71d8e75f6cc9c9f3a481b339df59?d=identicon&s=25 Paul Golea (uddun)
on 2009-02-23 11:32
F. Senault wrote:
>
> And the second CRC corresponds to what other tools give me.
>
> Fred

Excellent!
I didn't know that File.read opened "badly" files under Windows...

Thank you very much.
Ef3aa7f7e577ea8cd620462724ddf73b?d=identicon&s=25 Rob Biedenharn (Guest)
on 2009-02-23 15:41
(Received via mailing list)
On Feb 23, 2009, at 5:31 AM, Paul Golea wrote:

> F. Senault wrote:
>>
>> And the second CRC corresponds to what other tools give me.
>>
>> Fred
>
> Excellent!
> I didn't know that File.read opened "badly" files under Windows...
>
> Thank you very much.


Change this:
f = File.read('bibi.jpg') ; nil

to this: (mode of 'r', not 'rb')
f = nil
File.open('bibi.jpg', 'r') { |h| f = h.read } ; nil

And you'll get the same result. File.read is not the problem, but the
use of text mode (which is the default). Under Unix, there is no
difference between text mode and binary mode, but the line endings
under Windows are \015\012.

-Rob

Rob Biedenharn    http://agileconsultingllc.com
Rob@AgileConsultingLLC.com
This topic is locked and can not be replied to.