【求助】在MicroPython中,如何实现整数的自动溢出?
【求助】在MicroPython中,如何实现整数的自动溢出?
我正在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类似的方法呢?
----------------------------------------------------------------------------------------------
/**
* @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中,如何实现整数的自动溢出?
可以试试 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
>>> 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中,如何实现整数的自动溢出?
我尝试了按照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
-------------------------------------------------------------
是我使用的方式不对吗?
-------------------------------------------------------------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中,如何实现整数的自动溢出?
试了一下ctype,micropython还有一些功能不支持,的确不行。现在可能只能用 machine.mem8 / machine.mem16 / machine.mem32 函数,用没有使用到的寄存器实现整数溢出。
-
- 帖子: 48
- 注册时间: 2021年 6月 3日 10:12
Re: 【求助】在MicroPython中,如何实现整数的自动溢出?
怎么判断会不会用到,有没有用的,这样改数据比较危险
-
- 帖子: 48
- 注册时间: 2021年 6月 3日 10:12
Re: 【求助】在MicroPython中,如何实现整数的自动溢出?
最好可以把这个算法用c写,作为模块编译进mpy
Re: 【求助】在MicroPython中,如何实现整数的自动溢出?
machine.mem8 / machine.mem16 / machine.mem32
这种方法 不会啊
这种方法 不会啊
Re: 【求助】在MicroPython中,如何实现整数的自动溢出?
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
AttributeError: 'module' object has no attribute 'men8
File "<stdin>", line 5, in <module>
AttributeError: 'module' object has no attribute 'men8
- shaoziyang
- 帖子: 3917
- 注册时间: 2019年 10月 21日 13:48
Re: 【求助】在MicroPython中,如何实现整数的自动溢出?
mem8/mem16/mem32 就是以8/16/32位方式访问芯片内部寄存器,访问寄存器是以寄存器名称(地址)+ 偏移量方式,寄存器名称是固件编译时就定义好的。部分寄存器可能没有定义,可以通过地址(整数)方式访问。
基本用法如下,以STM32为例,其它mcu需要查看对应的数据手册,确定寄存器名称。
基本用法如下,以STM32为例,其它mcu需要查看对应的数据手册,确定寄存器名称。
代码: 全选
import machine
import stm
BIT14 = const(1 << 14)
machine.mem16[stm.GPIOA + stm.GPIO_ODR] ^= BIT14
-
- 随机主题
- 回复总数
- 阅读次数
- 最新文章
-
- 11回复总数
- 551 阅读次数
- 最新文章 由 zhoukang8888
2023年 9月 1日 19:46
-
- 1回复总数
- 561 阅读次数
- 最新文章 由 shaoziyang
2023年 8月 28日 13:03
-
- 10回复总数
- 607 阅读次数
- 最新文章 由 Node_Ice
2023年 9月 1日 15:03