cubefs

Форк
0
87 строк · 1.7 Кб
1
package sarama
2

3
import (
4
	"encoding/binary"
5
	"fmt"
6
	"hash/crc32"
7
	"sync"
8
)
9

10
type crcPolynomial int8
11

12
const (
13
	crcIEEE crcPolynomial = iota
14
	crcCastagnoli
15
)
16

17
var crc32FieldPool = sync.Pool{}
18

19
func acquireCrc32Field(polynomial crcPolynomial) *crc32Field {
20
	val := crc32FieldPool.Get()
21
	if val != nil {
22
		c := val.(*crc32Field)
23
		c.polynomial = polynomial
24
		return c
25
	}
26
	return newCRC32Field(polynomial)
27
}
28

29
func releaseCrc32Field(c *crc32Field) {
30
	crc32FieldPool.Put(c)
31
}
32

33
var castagnoliTable = crc32.MakeTable(crc32.Castagnoli)
34

35
// crc32Field implements the pushEncoder and pushDecoder interfaces for calculating CRC32s.
36
type crc32Field struct {
37
	startOffset int
38
	polynomial  crcPolynomial
39
}
40

41
func (c *crc32Field) saveOffset(in int) {
42
	c.startOffset = in
43
}
44

45
func (c *crc32Field) reserveLength() int {
46
	return 4
47
}
48

49
func newCRC32Field(polynomial crcPolynomial) *crc32Field {
50
	return &crc32Field{polynomial: polynomial}
51
}
52

53
func (c *crc32Field) run(curOffset int, buf []byte) error {
54
	crc, err := c.crc(curOffset, buf)
55
	if err != nil {
56
		return err
57
	}
58
	binary.BigEndian.PutUint32(buf[c.startOffset:], crc)
59
	return nil
60
}
61

62
func (c *crc32Field) check(curOffset int, buf []byte) error {
63
	crc, err := c.crc(curOffset, buf)
64
	if err != nil {
65
		return err
66
	}
67

68
	expected := binary.BigEndian.Uint32(buf[c.startOffset:])
69
	if crc != expected {
70
		return PacketDecodingError{fmt.Sprintf("CRC didn't match expected %#x got %#x", expected, crc)}
71
	}
72

73
	return nil
74
}
75

76
func (c *crc32Field) crc(curOffset int, buf []byte) (uint32, error) {
77
	var tab *crc32.Table
78
	switch c.polynomial {
79
	case crcIEEE:
80
		tab = crc32.IEEETable
81
	case crcCastagnoli:
82
		tab = castagnoliTable
83
	default:
84
		return 0, PacketDecodingError{"invalid CRC type"}
85
	}
86
	return crc32.Checksum(buf[c.startOffset+4:curOffset], tab), nil
87
}
88

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.