| 12345678910111213141516171819202122232425262728293031323334353637 |
- package sarama
- import (
- "encoding/binary"
- "fmt"
- "hash/crc32"
- )
- // crc32Field implements the pushEncoder and pushDecoder interfaces for calculating CRC32s.
- type crc32Field struct {
- startOffset int
- }
- func (c *crc32Field) saveOffset(in int) {
- c.startOffset = in
- }
- func (c *crc32Field) reserveLength() int {
- return 4
- }
- func (c *crc32Field) run(curOffset int, buf []byte) error {
- crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
- binary.BigEndian.PutUint32(buf[c.startOffset:], crc)
- return nil
- }
- func (c *crc32Field) check(curOffset int, buf []byte) error {
- crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
- expected := binary.BigEndian.Uint32(buf[c.startOffset:])
- if crc != expected {
- return PacketDecodingError{fmt.Sprintf("CRC didn't match expected %#x got %#x", expected, crc)}
- }
- return nil
- }
|