【求助】在MicroPython中,如何实现整数的自动溢出?

ESP32、ESP8266
ESP32-S2、ESP32-S3、ESP32-C3
JiuZhou
帖子: 4
注册时间: 2021年 12月 25日 10:18

【求助】在MicroPython中,如何实现整数的自动溢出?

#1

帖子 JiuZhou »

我正在MicroPython中实现Tea加解密算法,但是我遇到一个难题。如下
----------------------------------------------------------------------------------------------
/**
* @brief tea加密
* @param v:要加密的数据,长度为8字节
* @param k:加密用的key,长度为16字节
* @return void
*/
static void tea_encrypt(uint32_t *v, uint32_t *k)
{
    uint32_t y = v[0], z = v[1], sum = 0, i;
    uint32_t delta = 0x9e3779b9;
    uint32_t a = k[0], b = k[1], c = k[2], d = k[3];

    for (i = 0; i < 32; i++)
    {
        sum += delta;
        y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
        z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
    }
    v[0] = y;
    v[1] = z;
}
----------------------------------------------------------------------------------------------

这个是C语言中的加密实现,Y和Z都被定义为一个uint32的类型,当我按照以上这个算法用Python实现时,由于Python的机制,当X和Y超过0xFFFFFFFF后,会继续+1,而不是溢出,导致最终算出来的数据非常大(上百位)。
 此外,我不想通过每运算一次 就 (& 0XFFFFFFFF),这样写法太复杂了
 MicroPython是否有提供一个类似CPython里面的ctype.c_uint32类似的方法呢?
 
 
 
 

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#2

帖子 shaoziyang »

可以试试 ctypes 库

>>> import ctypes
>>> ctypes.
ARRAY           BFINT16         BFINT32         BFINT8
BFUINT16        BFUINT32        BFUINT8         BF_LEN
BF_POS          BIG_ENDIAN      FLOAT32         FLOAT64
INT             INT16           INT32           INT64
INT8            LITTLE_ENDIAN   LONG            LONGLONG
NATIVE          PTR             SHORT           UINT
UINT16          UINT32          UINT64          UINT8
ULONG           ULONGLONG       USHORT          VOID
addressof       bytearray_at    bytes_at        sizeof
struct

 

 
 

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#3

帖子 shaoziyang »


JiuZhou
帖子: 4
注册时间: 2021年 12月 25日 10:18

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#4

帖子 JiuZhou »

我尝试了按照MicroPython教程中的uctypes库
-------------------------------------------------------------COORD = {
"x": 0 | uctypes.FLOAT32,
"y": 4 | uctypes.FLOAT32,
}

STRUCT1 = {
"data1": 0 | uctypes.UINT8,
"data2": 4 | uctypes.UINT32,
"ptr": (8 | uctypes.PTR, COORD),
}-------------------------------------------------------------

但是我安装此种方式:打印出来的值其实并没有溢出
-------------------------------------------------------------import uctypes

code = {
"x": 255 | uctypes.UINT8,
"y": 256 | uctypes.UINT8,
}

print(code["x"])
print(code["y"])

>>> %Run -c $EDITOR_CONTENT
255
256
-------------------------------------------------------------
是我使用的方式不对吗?

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#5

帖子 shaoziyang »

试了一下ctype,micropython还有一些功能不支持,的确不行。现在可能只能用 machine.mem8 / machine.mem16 / machine.mem32 函数,用没有使用到的寄存器实现整数溢出。

15268026301
帖子: 48
注册时间: 2021年 6月 3日 10:12

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#6

帖子 15268026301 »

怎么判断会不会用到,有没有用的,这样改数据比较危险

15268026301
帖子: 48
注册时间: 2021年 6月 3日 10:12

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#7

帖子 15268026301 »

最好可以把这个算法用c写,作为模块编译进mpy

JiuZhou
帖子: 4
注册时间: 2021年 12月 25日 10:18

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#8

帖子 JiuZhou »

machine.mem8 / machine.mem16 / machine.mem32

这种方法 不会啊 :roll:
 

JiuZhou
帖子: 4
注册时间: 2021年 12月 25日 10:18

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#9

帖子 JiuZhou »

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
AttributeError: 'module' object has no attribute 'men8

头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

Re: 【求助】在MicroPython中,如何实现整数的自动溢出?

#10

帖子 shaoziyang »

mem8/mem16/mem32 就是以8/16/32位方式访问芯片内部寄存器,访问寄存器是以寄存器名称(地址)+ 偏移量方式,寄存器名称是固件编译时就定义好的。部分寄存器可能没有定义,可以通过地址(整数)方式访问。

基本用法如下,以STM32为例,其它mcu需要查看对应的数据手册,确定寄存器名称。

代码: 全选

import machine
import stm

BIT14 = const(1 << 14)
machine.mem16[stm.GPIOA + stm.GPIO_ODR] ^= BIT14
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章