|
1 | 1 | import itertools
|
2 | 2 | import sys
|
| 3 | +import struct |
3 | 4 | from struct import unpack
|
4 | 5 | from io import BytesIO # noqa
|
5 | 6 |
|
@@ -99,95 +100,116 @@ def size(self):
|
99 | 100 | # Integer numbers
|
100 | 101 | # ========================================================================
|
101 | 102 |
|
| 103 | + packer_s1 = struct.Struct('b') |
| 104 | + packer_s2be = struct.Struct('>h') |
| 105 | + packer_s4be = struct.Struct('>i') |
| 106 | + packer_s8be = struct.Struct('>q') |
| 107 | + packer_s2le = struct.Struct('<h') |
| 108 | + packer_s4le = struct.Struct('<i') |
| 109 | + packer_s8le = struct.Struct('<q') |
| 110 | + |
| 111 | + packer_u1 = struct.Struct('B') |
| 112 | + packer_u2be = struct.Struct('>H') |
| 113 | + packer_u4be = struct.Struct('>I') |
| 114 | + packer_u8be = struct.Struct('>Q') |
| 115 | + packer_u2le = struct.Struct('<H') |
| 116 | + packer_u4le = struct.Struct('<I') |
| 117 | + packer_u8le = struct.Struct('<Q') |
| 118 | + |
102 | 119 | # ------------------------------------------------------------------------
|
103 | 120 | # Signed
|
104 | 121 | # ------------------------------------------------------------------------
|
105 | 122 |
|
106 | 123 | def read_s1(self):
|
107 |
| - return unpack('b', self.read_bytes(1))[0] |
| 124 | + return KaitaiStream.packer_s1.unpack(self.read_bytes(1))[0] |
108 | 125 |
|
109 | 126 | # ........................................................................
|
110 | 127 | # Big-endian
|
111 | 128 | # ........................................................................
|
112 | 129 |
|
113 | 130 | def read_s2be(self):
|
114 |
| - return unpack('>h', self.read_bytes(2))[0] |
| 131 | + return KaitaiStream.packer_s2be.unpack(self.read_bytes(2))[0] |
115 | 132 |
|
116 | 133 | def read_s4be(self):
|
117 |
| - return unpack('>i', self.read_bytes(4))[0] |
| 134 | + return KaitaiStream.packer_s4be.unpack(self.read_bytes(4))[0] |
118 | 135 |
|
119 | 136 | def read_s8be(self):
|
120 |
| - return unpack('>q', self.read_bytes(8))[0] |
| 137 | + return KaitaiStream.packer_s8be.unpack(self.read_bytes(8))[0] |
121 | 138 |
|
122 | 139 | # ........................................................................
|
123 | 140 | # Little-endian
|
124 | 141 | # ........................................................................
|
125 | 142 |
|
126 | 143 | def read_s2le(self):
|
127 |
| - return unpack('<h', self.read_bytes(2))[0] |
| 144 | + return KaitaiStream.packer_s2le.unpack(self.read_bytes(2))[0] |
128 | 145 |
|
129 | 146 | def read_s4le(self):
|
130 |
| - return unpack('<i', self.read_bytes(4))[0] |
| 147 | + return KaitaiStream.packer_s4le.unpack(self.read_bytes(4))[0] |
131 | 148 |
|
132 | 149 | def read_s8le(self):
|
133 |
| - return unpack('<q', self.read_bytes(8))[0] |
| 150 | + return KaitaiStream.packer_s8le.unpack(self.read_bytes(8))[0] |
134 | 151 |
|
135 | 152 | # ------------------------------------------------------------------------
|
136 | 153 | # Unsigned
|
137 | 154 | # ------------------------------------------------------------------------
|
138 | 155 |
|
139 | 156 | def read_u1(self):
|
140 |
| - return unpack('B', self.read_bytes(1))[0] |
| 157 | + return KaitaiStream.packer_u1.unpack(self.read_bytes(1))[0] |
141 | 158 |
|
142 | 159 | # ........................................................................
|
143 | 160 | # Big-endian
|
144 | 161 | # ........................................................................
|
145 | 162 |
|
146 | 163 | def read_u2be(self):
|
147 |
| - return unpack('>H', self.read_bytes(2))[0] |
| 164 | + return KaitaiStream.packer_u2be.unpack(self.read_bytes(2))[0] |
148 | 165 |
|
149 | 166 | def read_u4be(self):
|
150 |
| - return unpack('>I', self.read_bytes(4))[0] |
| 167 | + return KaitaiStream.packer_u4be.unpack(self.read_bytes(4))[0] |
151 | 168 |
|
152 | 169 | def read_u8be(self):
|
153 |
| - return unpack('>Q', self.read_bytes(8))[0] |
| 170 | + return KaitaiStream.packer_u8be.unpack(self.read_bytes(8))[0] |
154 | 171 |
|
155 | 172 | # ........................................................................
|
156 | 173 | # Little-endian
|
157 | 174 | # ........................................................................
|
158 | 175 |
|
159 | 176 | def read_u2le(self):
|
160 |
| - return unpack('<H', self.read_bytes(2))[0] |
| 177 | + return KaitaiStream.packer_u2le.unpack(self.read_bytes(2))[0] |
161 | 178 |
|
162 | 179 | def read_u4le(self):
|
163 |
| - return unpack('<I', self.read_bytes(4))[0] |
| 180 | + return KaitaiStream.packer_u4le.unpack(self.read_bytes(4))[0] |
164 | 181 |
|
165 | 182 | def read_u8le(self):
|
166 |
| - return unpack('<Q', self.read_bytes(8))[0] |
| 183 | + return KaitaiStream.packer_u8le.unpack(self.read_bytes(8))[0] |
167 | 184 |
|
168 | 185 | # ========================================================================
|
169 | 186 | # Floating point numbers
|
170 | 187 | # ========================================================================
|
171 | 188 |
|
| 189 | + packer_f4be = struct.Struct('>f') |
| 190 | + packer_f8be = struct.Struct('>d') |
| 191 | + packer_f4le = struct.Struct('<f') |
| 192 | + packer_f8le = struct.Struct('<d') |
| 193 | + |
172 | 194 | # ........................................................................
|
173 | 195 | # Big-endian
|
174 | 196 | # ........................................................................
|
175 | 197 |
|
176 | 198 | def read_f4be(self):
|
177 |
| - return unpack('>f', self.read_bytes(4))[0] |
| 199 | + return KaitaiStream.packer_f4be.unpack(self.read_bytes(4))[0] |
178 | 200 |
|
179 | 201 | def read_f8be(self):
|
180 |
| - return unpack('>d', self.read_bytes(8))[0] |
| 202 | + return KaitaiStream.packer_f8be.unpack(self.read_bytes(8))[0] |
181 | 203 |
|
182 | 204 | # ........................................................................
|
183 | 205 | # Little-endian
|
184 | 206 | # ........................................................................
|
185 | 207 |
|
186 | 208 | def read_f4le(self):
|
187 |
| - return unpack('<f', self.read_bytes(4))[0] |
| 209 | + return KaitaiStream.packer_f4le.unpack(self.read_bytes(4))[0] |
188 | 210 |
|
189 | 211 | def read_f8le(self):
|
190 |
| - return unpack('<d', self.read_bytes(8))[0] |
| 212 | + return KaitaiStream.packer_f8le.unpack(self.read_bytes(8))[0] |
191 | 213 |
|
192 | 214 | # ========================================================================
|
193 | 215 | # Unaligned bit values
|
|
0 commit comments