--------------enig864F2775BF31181C968CAABB
Content-Type: multipart/mixed;
boundary="------------010001060308060406090600"
This is a multi-part message in MIME format.
--------------010001060308060406090600
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Hi,
Andrew said:
Outstanding! I forgot to ask in the original post, however, that I also
need a library for creating CRC's with a divisor of 32bits. Does
something like this exist?
You can use Zlib.crc32 if you need CRC32-Reversed. And attached is my
port of CRC base functions in Classless.hasher at
http://www.classless.net/projects/hasher/ . Use this if you need CRC32
- not Reversed.
Regards,
// NaHi
--------------010001060308060406090600
Content-Type: text/plain;
name="crc.rb"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="crc.rb"
# crc.rb - Ruby port of CRC.cs in Classless.Hasher - C#/.NET Hash and Checksum Algorithm Library. (
http://www.classless.net/projects/hasher/)
=begin
following is an excerpt of CRC.cs in Classless.Hasher.
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Classless.Hasher - C#/.NET Hash and Checksum Algorithm Library.
*
* The Initial Developer of the Original Code is Classless.net.
* Portions created by the Initial Developer are Copyright (C) 2004 the Initial
* Developer. All Rights Reserved.
*
* Contributor(s):
* Jason Simeone (
[email protected])
*
* ***** END LICENSE BLOCK ***** */
=end
class CRC
def initialize(order, poly, iv, xor, reflect)
@order = order
@poly = poly
@iv = iv
@xor = xor
@reflect = reflect
if @reflect
@mask = (2 ** (@order - 8)) - 1
end
@lookup = build_lookup
@crc = init
end
def init
crc = @iv
if @reflect
crc = reflect(crc, @order)
end
crc
end
def update(str)
topbit = 1 << (@order - 1)
widthmask = (topbit << 1) - 1
str.each_byte do |byte|
if @reflect
@crc = ((@crc >> 8) & @mask) ^ @lookup[(@crc ^ byte) & 0xFF]
else
@crc = (@crc << 8) ^ @lookup[((@crc >> (@order - 8)) ^ byte) & 0xFF]
end
@crc &= widthmask
end
end
def final
@crc ^= @xor
bytes = (@order + 7) >> 3
@crc
end
private
def build_lookup
lookup = []
topbit = 1 << (@order - 1)
widthmask = (topbit << 1) - 1
for idx in 0..255
v = idx
v = reflect(v, 8) if @reflect
v <<= (@order - 8)
8.times do
if (v & topbit).nonzero?
v = (v << 1) ^ @poly
else
v <<= 1
end
end
v = reflect(v, @order) if @reflect
v &= widthmask
lookup << v
end
lookup
end
def reflect(crc, bits)
base = crc
for idx in 0...bits
bitmask = 1 << ((bits - 1) - idx)
if (base & 1).nonzero?
crc |= bitmask;
else
crc &= ~bitmask;
end
base >>= 1
end
crc
end
end
if __FILE__ == $0
crc32 = CRC.new(32, 0xEDB88320, 0xFFFFFFFF, 0xFFFFFFFF, false)
crc32rev = CRC.new(32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true)
crc32.update("12345")
p crc32.final
crc32rev.update("12345")
p crc32rev.final
require 'zlib'
p Zlib.crc32("12345")
crc8 = CRC.new(8, 0xE0, 0x00, 0x00, false)
msg = ARGV.shift
msg = "\1\2\3\4"
crc8.update(msg)
printf("%x\n", crc8.final)
require 'pgp/util'
crc24 = CRC.new(24, 0x01864cfb, 0x00b704ce, 0, false)
msg = ARGV.shift
crc24.update(msg)
p crc24.final
p PGP::Util.crc24(msg)
end
--------------010001060308060406090600--
--------------enig864F2775BF31181C968CAABB
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Cygwin)
iD8DBQFC6Yp5f6b33ts2dPkRAjxeAKCQRZMSG2NwE1lrl3BG6gyFcX3T/ACgypyW
TdXCG+Uf80nwW/77tU9Ahfw=
=kRCL
-----END PGP SIGNATURE-----
--------------enig864F2775BF31181C968CAABB--