crc32_field.go 716 B

12345678910111213141516171819202122232425262728293031323334
  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) {
  17. crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
  18. binary.BigEndian.PutUint32(buf[c.startOffset:], crc)
  19. }
  20. func (c *CRC32Field) Check(curOffset int, buf []byte) error {
  21. crc := crc32.ChecksumIEEE(buf[c.startOffset+4 : curOffset])
  22. if crc != binary.BigEndian.Uint32(buf[c.startOffset:]) {
  23. return DecodingError
  24. }
  25. return nil
  26. }