Re: binascii.crc32 results not matching

2005-12-11 Thread Larry Bates
Thanks so much for the offer, I had a friend do this for
me and it works great.

Regards,
Larry Bates

Heiko Wundram wrote:
 Larry Bates wrote:
 
snip lots of code

The algorithm looks very much like the source code for
binascii.crc32 (but I'm not a C programmer).
 
 
 Well... As you have access to the code, you might actually just create a
 thin Python-Wrapper around this so that you can get comparable results. In
 case you're unable to do so, send me the C-file (I'm not so keen on
 copy-pasting code which was reformatted due to mail), and I'll send you an
 extension module back.
 
 --- Heiko.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-11 Thread Fredrik Lundh
I wrote:

 this prints

 0xF032519BL 0xF032519BL
 0x90E3070AL 0x90E3070AL

 no time to sort out the int/long mess for binascii.crc32, but it pro-
 bably needs the same tweaking as PIL (which handles the CRC as
 two 16-bit numbers, to avoid sign hell).

I realized that I used 2.3 for testing.  under 2.4, the following snippet
runs without warnings:

import binascii

def test2(text, crc=0):
return hex((binascii.crc32(text, crc^-1)^-1)0x)

in other words,

crc = binascii.crc32(text, crc^-1)^-1)0x

should give the same result as larry's original CalculateCrc function.

/F



-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-10 Thread Raymond L. Buvel
Peter Hansen wrote:
 Larry Bates wrote:
 
 I'm trying to get the results of binascii.crc32
 to match the results of another utility that produces
 32 bit unsigned CRCs.  
 
 
 What other utility?  As Tim says, there are many CRC32s... the
 background notes on this one happen to stumble out at the top of the
 list in response to googling for zip file crc32 checksum polynomial,
 though I'm sure there are easier ways.  The binascii docs say its CRC32
 is compatible with the Zip file checksum, but they don't describe it
 further.
 
 Generally CRCs are described in terms of their polynomial, though just
 quoting that isn't sufficient to describe their behaviour, but if you
 happen to know the polynomial for your utility, someone else can
 probably point you to a more appropriate routine, or perhaps explain
 what you were doing wrong if the binascii one is actually the right one..
 
 -Peter
 

Check out the unit test in the following.

http://sourceforge.net/projects/crcmod/

I went to a lot of trouble to get the results to match the results of
binascii.crc32.  As you will see, there are a couple of extra operations
 even after you get the polynomial and bit ordering correct.

Ray
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-10 Thread Peter Hansen
Raymond L. Buvel wrote:
 Check out the unit test in the following.
 
 http://sourceforge.net/projects/crcmod/
 
 I went to a lot of trouble to get the results to match the results of
 binascii.crc32.  As you will see, there are a couple of extra operations
  even after you get the polynomial and bit ordering correct.

Beautiful!

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-10 Thread Tim Peters
[Raymond L. Buvel]
 Check out the unit test in the following.

 http://sourceforge.net/projects/crcmod/

Cool!

 I went to a lot of trouble to get the results to match the results of
 binascii.crc32.  As you will see, there are a couple of extra operations
 even after you get the polynomial and bit ordering correct.

Nevertheless, the purpose of binascii.crc32 is to compute exactly the
same result as most zip programs give.  All the details (including
what look to you like extra operations ;-)) were specified by RFC
1952 (the GZIP file format specification).  As a result,
binascii.crc32 matches, e.g., the CRCs reported by WinZip on Windows,
and gives the same results as zlib.crc32 (as implemented by the zlib
developers).
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-10 Thread Raymond L. Buvel
Tim Peters wrote:
 [Raymond L. Buvel]
 
Check out the unit test in the following.

http://sourceforge.net/projects/crcmod/
 
 
 Cool!
 
 
I went to a lot of trouble to get the results to match the results of
binascii.crc32.  As you will see, there are a couple of extra operations
even after you get the polynomial and bit ordering correct.
 
 
 Nevertheless, the purpose of binascii.crc32 is to compute exactly the
 same result as most zip programs give.  All the details (including
 what look to you like extra operations ;-)) were specified by RFC
 1952 (the GZIP file format specification).  As a result,
 binascii.crc32 matches, e.g., the CRCs reported by WinZip on Windows,
 and gives the same results as zlib.crc32 (as implemented by the zlib
 developers).

Since there are probably others following this thread, it should be
pointed out that the specification of those extra operations is to
avoid some pathalogical conditions that you can get with a simplistic
CRC operation.  For example, using 0 as the starting value will give a
value of zero for an arbitrary string of zeros.  Consequently, a file
starting with a string of zeros will have the same CRC as one with the
zeros stripped off.  While starting with 0x will give a non-zero
value.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-10 Thread Larry Bates
Peter Hansen wrote:
 Larry Bates wrote:
 
 I'm trying to get the results of binascii.crc32
 to match the results of another utility that produces
 32 bit unsigned CRCs.  
 
 
 What other utility?  As Tim says, there are many CRC32s... the
 background notes on this one happen to stumble out at the top of the
 list in response to googling for zip file crc32 checksum polynomial,
 though I'm sure there are easier ways.  The binascii docs say its CRC32
 is compatible with the Zip file checksum, but they don't describe it
 further.
 
 Generally CRCs are described in terms of their polynomial, though just
 quoting that isn't sufficient to describe their behaviour, but if you
 happen to know the polynomial for your utility, someone else can
 probably point you to a more appropriate routine, or perhaps explain
 what you were doing wrong if the binascii one is actually the right one..
 
 -Peter
 
It was a .DLL written by an employee that has long since
left the company.  We want to move the code to Linux for
nightly checking of files.  I don't know what to do but
post some long code.  See below:

/
INCLUDES
 /
#include windows.h
#include string.h
#include malloc.h
#include stdio.h
#include stdlib.h
#include filecrc.h

/
   ModuleName: filecrc.c
   Author: Syscon Computers - Modified by Barry Weck
   Project:PowerBuilder External File CRC function
   Date created:   May. 18, 1999
   Last Modified:  Jun. 09, 1999
   Module Owner:   Syscon Computers

   Module description:

  This module implements a algorithm for calculating the CRC (Cyclic
  Redundency Check) of a binary file.  This function is meant to be
  compiled as a 16 bit Microsoft Windows (Tm) DLL with either the 16 bit C
  compilers of Borland or Microsoft.  Compilation under other other
  compilers has not been tested.  The requirement of 16-bit DLL is
  nessesitated by the version of PowerBuilder used by syscon.

  This module was written by a third party and was then modified by
  subcontractor Barry Weck.  The code is copyrighted and owned by Syscon
  Computers, Inc. of Tuscaloosa Alabama (C) 1999.


 /
/
DATA
 /
static unsigned long ccitt_32[256] =
{
   0xUL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL,
   0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL,
0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL,
   0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL,
0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL,
   0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL,
0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL,
   0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL,
0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
   0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL,
   0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL,
0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL,
   0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL,
0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL,
   0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL,
0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL,
   0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL,
0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
   0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL,
   0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL,
0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL,
   0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL,
0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL,
   0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL,
0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL,
   0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL,
0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
   0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL,
   0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL,
0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL,
   0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL,
0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL,
   0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL,
0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL,
   0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL,
0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
   0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 

Re: binascii.crc32 results not matching

2005-12-10 Thread Fredrik Lundh
Larry Bates wrote:

 def CalculateCrc(buffer, crc):

/snip/

 The algorithm looks very much like the source code for
 binascii.crc32 (but I'm not a C programmer).

does your Python version give the right result ?   if so, the following
might be somewhat helpful:

def test1(text, crc=0):

# larry's code
result = CalculateCrc(text, crc)
return hex(result[0])

def test2(text, crc=0):

import Image

# using pil's crc32 api
a = (crc  16) ^ 65535
b = (crc  65535) ^ 65535
a, b = Image.core.crc32(text, (a, b))
a ^= 65535
b ^= 65535
return 0x%04X%04XL % (a, b)

def test(text):
print test1(text), test2(text)

test(hello)
test(goodbye)

this prints

0xF032519BL 0xF032519BL
0x90E3070AL 0x90E3070AL

no time to sort out the int/long mess for binascii.crc32, but it pro-
bably needs the same tweaking as PIL (which handles the CRC as
two 16-bit numbers, to avoid sign hell).

/F



-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-10 Thread Raymond L. Buvel
Larry Bates wrote:
snip a lot of code

Looking over the code, it seems very inefficient and hard to understand.
 You really should check out the following.

http://sourceforge.net/projects/crcmod/

It will allow you to generate efficient CRC functions for use in Python
and in C or C++.  The only thing you need to input is the polynomial,
the bit ordering, and the starting value.  The unit test gives a number
of polynomials including the one you are using which is:

polynomial: 0x104C11DB7, bit reverse algorithm

If you are just looking for a utility on Linux to do nightly checking of
files, I strongly recommend md5sum.  My timing tests indicate that the
MD5 algorithm is comparable or slightly faster than a 32-bit CRC and
certainly faster than the code you are trying to port.  It also has the
advantage of being a standard Linux command so you don't need to code
anything.

Ray
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-10 Thread Heiko Wundram
Larry Bates wrote:
 snip lots of code

 The algorithm looks very much like the source code for
 binascii.crc32 (but I'm not a C programmer).

Well... As you have access to the code, you might actually just create a
thin Python-Wrapper around this so that you can get comparable results. In
case you're unable to do so, send me the C-file (I'm not so keen on
copy-pasting code which was reformatted due to mail), and I'll send you an
extension module back.

--- Heiko.
-- 
http://mail.python.org/mailman/listinfo/python-list


binascii.crc32 results not matching

2005-12-09 Thread Larry Bates
I'm trying to get the results of binascii.crc32
to match the results of another utility that produces
32 bit unsigned CRCs.  binascii.crc32 returns
results in the range of -2**31-1 and 2**21-1. Has
anyone ever worked out any bit twiddling code to
get a proper unsigned 32 bit result from binascii.crc32?

Output snip from test on three files:

binascii.crc32=-1412119273, oldcrc32= 2221277246
binascii.crc32=-647246320, oldcrc32=73793598
binascii.crc32=-1391482316, oldcrc32=79075810

Thanks in advance,
Regards,
Larry Bates
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-09 Thread Tim Peters
[Larry Bates]
 I'm trying to get the results of binascii.crc32
 to match the results of another utility that produces
 32 bit unsigned CRCs.  binascii.crc32 returns
 results in the range of -2**31-1 and 2**21-1. Has
 anyone ever worked out any bit twiddling code to
 get a proper unsigned 32 bit result from binascii.crc32?

Just  the result with 0x (a string of 32 1-bits).

 Output snip from test on three files:

 binascii.crc32=-1412119273, oldcrc32= 2221277246
 binascii.crc32=-647246320, oldcrc32=73793598
 binascii.crc32=-1391482316, oldcrc32=79075810

Doesn't look like these are using the same CRC algorithms (there are
many distinct ways to compute a 32-bit CRC).  For example,

 print -1412119273  0x
2882848023

and that's not equal to 2221277246.  Or you're on Windows, and forgot
to open the files in binary mode.  Or something ;-)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: binascii.crc32 results not matching

2005-12-09 Thread Peter Hansen
Larry Bates wrote:
 I'm trying to get the results of binascii.crc32
 to match the results of another utility that produces
 32 bit unsigned CRCs.  

What other utility?  As Tim says, there are many CRC32s... the 
background notes on this one happen to stumble out at the top of the 
list in response to googling for zip file crc32 checksum polynomial, 
though I'm sure there are easier ways.  The binascii docs say its CRC32 
is compatible with the Zip file checksum, but they don't describe it 
further.

Generally CRCs are described in terms of their polynomial, though just 
quoting that isn't sufficient to describe their behaviour, but if you 
happen to know the polynomial for your utility, someone else can 
probably point you to a more appropriate routine, or perhaps explain 
what you were doing wrong if the binascii one is actually the right one..

-Peter

-- 
http://mail.python.org/mailman/listinfo/python-list