crc32_field.go 734 B

1234567891011121314151617181920212223242526272829303132333435
  1. package encoding
  2. import (
  3. "encoding/binary"
  4. "hash/crc32"
  5. )
  6. // CRC32Field implements the PushEncoder and PushDecoder interfaces for calculating CRC32s.
  7. type CRC32Field struct {
  8. startOffset int
  9. }
  10. func (c *CRC32Field) SaveOffset(in int) {
  11. c.startOffset = in
  12. }
  13. func (c *CRC32Field) ReserveLength() int {
  14. return 4
  15. }
  16. func (c *CRC32Field) Run(curOffset int, buf []byte) error {
  17. crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
  18. binary.BigEndian.PutUint32(buf[c.startOffset:], crc)
  19. return nil
  20. }
  21. func (c *CRC32Field) Check(curOffset int, buf []byte) error {
  22. crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
  23. if crc != binary.BigEndian.Uint32(buf[c.startOffset:]) {
  24. return DecodingError
  25. }
  26. return nil
  27. }