@@ -125,6 +125,28 @@ mp_obj_t mp_binary_get_val_array(char typecode, void *p, int index) {
125125 return MP_OBJ_NEW_SMALL_INT (val );
126126}
127127
128+ machine_int_t mp_binary_get_int (uint size , bool is_signed , bool big_endian , byte * p ) {
129+ int delta ;
130+ if (!big_endian ) {
131+ delta = -1 ;
132+ p += size - 1 ;
133+ } else {
134+ delta = 1 ;
135+ }
136+
137+ machine_int_t val = 0 ;
138+ if (is_signed && * p & 0x80 ) {
139+ val = -1 ;
140+ }
141+ for (uint i = 0 ; i < size ; i ++ ) {
142+ val <<= 8 ;
143+ val |= * p ;
144+ p += delta ;
145+ }
146+
147+ return val ;
148+ }
149+
128150#define is_signed (typecode ) (typecode > 'Z')
129151mp_obj_t mp_binary_get_val (char struct_type , char val_type , byte * * ptr ) {
130152 byte * p = * ptr ;
@@ -140,26 +162,10 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr) {
140162 struct_type = '>' ;
141163 #endif
142164 }
165+ * ptr = p + size ;
143166
144- int delta ;
145- if (struct_type == '<' ) {
146- delta = -1 ;
147- p += size - 1 ;
148- } else {
149- delta = 1 ;
150- }
151-
152- machine_int_t val = 0 ;
153- if (is_signed (val_type ) && * p & 0x80 ) {
154- val = -1 ;
155- }
156- for (uint i = 0 ; i < size ; i ++ ) {
157- val <<= 8 ;
158- val |= * p ;
159- p += delta ;
160- }
167+ machine_int_t val = mp_binary_get_int (size , is_signed (val_type ), (struct_type == '>' ), p );
161168
162- * ptr += size ;
163169 if (val_type == 'O' ) {
164170 return (mp_obj_t )val ;
165171 } else if (val_type == 'S' ) {
@@ -185,6 +191,7 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte **
185191 struct_type = '>' ;
186192 #endif
187193 }
194+ * ptr = p + size ;
188195
189196#if MP_ENDIANNESS_BIG
190197#error Not implemented
@@ -215,7 +222,6 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte **
215222 in += in_delta ;
216223 }
217224
218- * ptr += size ;
219225}
220226
221227void mp_binary_set_val_array (char typecode , void * p , int index , mp_obj_t val_in ) {
0 commit comments