diff options
author | Damien George <damien.p.george@gmail.com> | 2014-10-06 13:45:34 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-10-06 13:45:34 +0000 |
commit | fcdb2398156bb208c2bf54dd184835038f2398f5 (patch) | |
tree | 488ab62be4e6cb27a51e7f01558a1361e9fe1f3c | |
parent | a9bcd51dc7f05be0961f699f39d1856e78eaaaa6 (diff) | |
download | micropython-fcdb2398156bb208c2bf54dd184835038f2398f5.tar.gz micropython-fcdb2398156bb208c2bf54dd184835038f2398f5.zip |
py: Make int.to_bytes work on big endian machine.
Partly addresses issue #856.
-rw-r--r-- | py/objint.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/py/objint.c b/py/objint.c index e0fa7d661a..8e048ddec3 100644 --- a/py/objint.c +++ b/py/objint.c @@ -327,20 +327,28 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(int_from_bytes_fun_obj, 2, 3, int_fro STATIC MP_DEFINE_CONST_CLASSMETHOD_OBJ(int_from_bytes_obj, (const mp_obj_t)&int_from_bytes_fun_obj); STATIC mp_obj_t int_to_bytes(mp_uint_t n_args, const mp_obj_t *args) { + // TODO: Support long ints + // TODO: Support byteorder param (assumes 'little') + // TODO: Support signed param (assumes signed=False) + mp_int_t val = mp_obj_int_get_checked(args[0]); + mp_int_t len = MP_OBJ_SMALL_INT_VALUE(args[1]); - uint len = MP_OBJ_SMALL_INT_VALUE(args[1]); byte *data; - - // TODO: Support long ints - // TODO: Support byteorder param - // TODO: Support signed param mp_obj_t o = mp_obj_str_builder_start(&mp_type_bytes, len, &data); memset(data, 0, len); - memcpy(data, &val, len < sizeof(mp_int_t) ? len : sizeof(mp_int_t)); + + if (MP_ENDIANNESS_LITTLE) { + memcpy(data, &val, len < sizeof(mp_int_t) ? len : sizeof(mp_int_t)); + } else { + while (len--) { + *data++ = val; + val >>= 8; + } + } + return mp_obj_str_builder_end(o); } - STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(int_to_bytes_obj, 2, 4, int_to_bytes); STATIC const mp_map_elem_t int_locals_dict_table[] = { |