@@ -14,6 +14,13 @@ from numcodecs.abc import Codec
14
14
from numcodecs.compat import ensure_contiguous_ndarray
15
15
16
16
17
+ cdef extern from * :
18
+ """
19
+ const Py_ssize_t FOOTER_LENGTH = sizeof(uint32_t);
20
+ """
21
+ const Py_ssize_t FOOTER_LENGTH
22
+
23
+
17
24
cdef uint32_t _fletcher32(const uint8_t[::1 ] _data):
18
25
# converted from
19
26
# https://github.com/Unidata/netcdf-c/blob/main/plugins/H5checksum.c#L109
@@ -66,13 +73,13 @@ class Fletcher32(Codec):
66
73
codec_id = " fletcher32"
67
74
68
75
def encode (self , buf ):
69
- """ Return buffer plus 4-byte fletcher checksum"""
76
+ """ Return buffer plus a footer with the fletcher checksum (4-bytes) """
70
77
buf = ensure_contiguous_ndarray(buf).ravel().view(' uint8' )
71
78
cdef const uint8_t[::1 ] b_mv = buf
72
79
cdef uint8_t* b_ptr = & b_mv[0 ]
73
80
cdef Py_ssize_t b_len = len (b_mv)
74
81
75
- cdef Py_ssize_t out_len = b_len + 4
82
+ cdef Py_ssize_t out_len = b_len + FOOTER_LENGTH
76
83
cdef bytes out = PyBytes_FromStringAndSize(NULL , out_len)
77
84
cdef uint8_t* out_ptr = < uint8_t* > out
78
85
@@ -88,8 +95,8 @@ class Fletcher32(Codec):
88
95
cdef uint8_t* b_ptr = & b_mv[0 ]
89
96
cdef Py_ssize_t b_len = len (b_mv)
90
97
91
- val = _fletcher32(b_mv[:- 4 ])
92
- found = load_le32(& b_mv[- 4 ])
98
+ val = _fletcher32(b_mv[:- FOOTER_LENGTH ])
99
+ found = load_le32(& b_mv[- FOOTER_LENGTH ])
93
100
if val != found:
94
101
raise RuntimeError (
95
102
f" The fletcher32 checksum of the data ({val}) did not"
@@ -102,7 +109,7 @@ class Fletcher32(Codec):
102
109
if out is not None :
103
110
out_mv = ensure_contiguous_ndarray(out).view(" uint8" )
104
111
out_ptr = & out_mv[0 ]
105
- memcpy(out_ptr, b_ptr, b_len - 4 )
112
+ memcpy(out_ptr, b_ptr, b_len - FOOTER_LENGTH )
106
113
else :
107
- out = b_mv[:- 4 ]
114
+ out = b_mv[:- FOOTER_LENGTH ]
108
115
return out
0 commit comments