~/bend-docscommunity

lib.bend source

lib.bend on the hub · documented module

# Crc32 — Base-only CRC-32 (ISO 3309 / Ethernet).## Input is a List<&2, U32>. Each element is an octet; only its low eight bits# are consumed. The state uses the reflected polynomial 0xEDB88320.import Base# Reflected CRC-32 constants. 0xFFFFFFFF is expressed as bitwise not of zero.def Crc32.init() -> U32:  U32.not(0)def Crc32.polynomial() -> U32:  3988292384# One reflected bit step. The low state bit selects whether the polynomial is# XORed after the logical right shift.def Crc32.step(+crc: U32) -> U32:  +shifted = U32.shr(crc)  Bool.pick(U32,    U32.is_zero(U32.and(crc, 1)),    shifted,    U32.xor(shifted, Crc32.polynomial()))# Process exactly eight bits of one octet.def Crc32.byte.go(n: Nat, +crc: U32) -> U32:  match n:    case 0n:      crc    case 1n+p:      Crc32.byte.go(p, Crc32.step(crc))def Crc32.byte(+octet: U32, +crc: U32) -> U32:  Crc32.byte.go(8n, U32.xor(crc, U32.and(octet, 255)))# Update the unfinalized CRC state over a list of octets.def Crc32.update.go(xs: List<&2, U32>, +crc: U32) -> U32:  match xs:    case Nil{}:      crc    case +octet <> rest:      Crc32.update.go(rest, Crc32.byte(octet, crc))def Crc32.update(+crc: U32, xs: List<&2, U32>) -> U32:  Crc32.update.go(xs, crc)# Apply the standard final XOR. `update` leaves this step to the caller so# chunks can be processed incrementally.def Crc32.finalize(+crc: U32) -> U32:  U32.xor(crc, Crc32.init())def Crc32.encode(xs: List<&2, U32>) -> U32:  Crc32.finalize(Crc32.update(Crc32.init(), xs))