补充
This commit is contained in:
405
Test/fbnq.py
Normal file
405
Test/fbnq.py
Normal file
@@ -0,0 +1,405 @@
|
||||
from stdlib import malloc, free
|
||||
import ctypes
|
||||
from stdint import *
|
||||
import string
|
||||
import w32.win32console
|
||||
from stdarg import va_start, va_end, va_arg, va_list
|
||||
import t
|
||||
import c
|
||||
|
||||
|
||||
class Struct1:
|
||||
a: UINT
|
||||
b: UINT = 123
|
||||
|
||||
S1: list[Struct1, 5] = [
|
||||
Struct1(1, 2),
|
||||
Struct1(b=3, a=4),
|
||||
Struct1(a=5, b=6),
|
||||
Struct1(7, b=8),
|
||||
Struct1(9)
|
||||
]
|
||||
S1_: Struct1 = Struct1(10)
|
||||
S1_2 = Struct1(112)
|
||||
|
||||
|
||||
def reptr(p: UINT | t.CPtr, v: UINT):
|
||||
c.DerefAs(p, v)
|
||||
|
||||
GLOBAL_VAR: t.CInt = 0
|
||||
|
||||
@t.Object
|
||||
class OOPTest2:
|
||||
fb: t.CVoid | t.CPtr
|
||||
def __init__(self):
|
||||
self.fb = malloc(1024)
|
||||
for i in range(0, 1024):
|
||||
self.fb[i] = '1'
|
||||
c.Set(t.CChar(self.fb[1023], t.CPtr), '\0')
|
||||
def GetFB(self) -> t.CChar | t.CPtr:
|
||||
return t.CChar(self.fb, t.CPtr)
|
||||
def __del__(self):
|
||||
print("OOPTest2 __del__")
|
||||
free(self.fb)
|
||||
|
||||
@t.Object
|
||||
class OOPTest:
|
||||
a: UINT
|
||||
b: UINT = 12345
|
||||
c: UINT
|
||||
oop2: OOPTest2 | t.CPtr
|
||||
def __init__(self):
|
||||
self.a = 451
|
||||
self.oop2 = c.Addr(OOPTest2())
|
||||
# c.Set(c.Deref(self.oop2.GetFB()[0]), 1)
|
||||
self.oop2.GetFB()[0] = '1'
|
||||
cp = self.oop2.fb # t.CChar(self.oop2.fb, t.CPtr)
|
||||
cp[1] = '4'
|
||||
cp[2] = '5'
|
||||
cp[3] = '6'
|
||||
cp[4] = '7'
|
||||
cp[5] = '8'
|
||||
cp[6] = '9'
|
||||
cp[7] = '0'
|
||||
cp[8] = '9'
|
||||
|
||||
print(t.CChar(cp[0], t.CPtr))
|
||||
print("长度:", t.CChar(cp, t.CPtr).__sizeof__())
|
||||
print("cp[0]:", cp[0])
|
||||
cp += 1
|
||||
print("cp[0]:", cp[0])
|
||||
cp += 1
|
||||
|
||||
print("self.oop2.GetFB()[0]:", int(cp[0]))
|
||||
#k = t.CChar(self.oop2.fb[1], t.CPtr)
|
||||
#k[0] = "4"
|
||||
|
||||
cp -= 2
|
||||
# print(t.CChar(cp, t.CPtr))
|
||||
|
||||
lambda_a = lambda: 1
|
||||
print(cp[0], lambda_a())
|
||||
|
||||
print(type(cp))
|
||||
print(dir(OOPTest2))
|
||||
|
||||
vkt: t.CVoid | t.CPtr = malloc(1024)
|
||||
c.Set(c.Deref(vkt[0]), 8080)
|
||||
vkt[0] = '2'
|
||||
# vkt[0] = 20
|
||||
print(t.CChar(vkt[0], t.CPtr)[0])
|
||||
print(type(vkt[0]))
|
||||
print(t.CChar(t.CInt("Hello"), t.CPtr))
|
||||
print(str((c.Addr("你好"))))
|
||||
# print(vkt)
|
||||
free(vkt)
|
||||
# print("vkt:", vkt)
|
||||
|
||||
vkt: t.CVoid | t.CPtr = malloc(1024)
|
||||
vkt2: t.CChar | t.CPtr = t.CChar(vkt, t.CPtr)
|
||||
vkt2[0] = '1'
|
||||
vkt2[100] = '1'
|
||||
print("首个参数:", vkt2[0])
|
||||
print("第100参数:", vkt2[100])
|
||||
#print("HEX", str_to_hex(vkt))
|
||||
free(vkt)
|
||||
print("HEX", str_to_hex("ABCDEFHIJKLMN"))
|
||||
print("HEX", str_to_hex("1"))
|
||||
|
||||
del self.oop2
|
||||
|
||||
|
||||
def str_to_hex(s: str) -> str:
|
||||
buf: str = malloc(1024)
|
||||
out: str = buf
|
||||
hex: list[str, None] = "0123456789ABCDEF"
|
||||
while c.Deref(s) != 0:
|
||||
cr: t.CUnsignedChar = c.Deref(s)
|
||||
c.Set(c.Deref(out), hex[(cr >> 4) & 0xF]) # 高 4 位
|
||||
out += 1
|
||||
c.Set(c.Deref(out), hex[cr & 0xF]) # 低 4 位
|
||||
out += 1
|
||||
s += 1 # 移动指针!
|
||||
c.Set(c.Deref(out), 0) # 结尾
|
||||
return buf
|
||||
|
||||
# 十进制 int → 16进制字符串(小写 0x 开头)
|
||||
# 内部 malloc(128),外部必须 free()
|
||||
def int_to_hex(num: int) -> str:
|
||||
buf = t.CChar(malloc(128), t.CPtr)
|
||||
if not buf: return None
|
||||
|
||||
hex_chars: list[t.CChar, None] = "0123456789ABCDEF"
|
||||
i = 0
|
||||
|
||||
# 先加 0x 前缀
|
||||
buf[i] = '0'
|
||||
buf[i + 1] = 'x'
|
||||
i += 2
|
||||
|
||||
# 处理 0
|
||||
if num == 0:
|
||||
buf[i] = '0'
|
||||
i += 1
|
||||
buf[i] = '0'
|
||||
i += 1
|
||||
buf[i] = '\0'
|
||||
return buf
|
||||
|
||||
# 存储逆序的十六进制字符
|
||||
temp: list[t.CChar, 32]
|
||||
temp_idx = 0
|
||||
|
||||
# 转为无符号,避免负数问题
|
||||
n: t.CUnsignedInt = t.CUnsignedInt(num)
|
||||
|
||||
while n > 0:
|
||||
rem: t.CInt = n & 0xF; # 取低4位(等价%16)
|
||||
temp[temp_idx] = hex_chars[rem]
|
||||
temp_idx += 1
|
||||
n = n >> 4; # 右移4位(等价/16)
|
||||
|
||||
# 反转写入最终缓冲区
|
||||
while temp_idx > 0:
|
||||
temp_idx -= 1
|
||||
buf[i] = temp[temp_idx]
|
||||
i += 1
|
||||
|
||||
buf[i] = '\0'
|
||||
return buf
|
||||
|
||||
|
||||
|
||||
def int_to_str(num: int) -> str:
|
||||
# 直接分配 128 字节(足够存任何 64 位整数)
|
||||
buf: t.CChar | t.CPtr = t.CChar(malloc(128), t.CPtr)
|
||||
if not buf: return None
|
||||
is_negative = 0
|
||||
i = 0
|
||||
# 处理 0
|
||||
if num == 0:
|
||||
buf[i] = '0'
|
||||
i += 1
|
||||
buf[i] = '\0'
|
||||
return buf
|
||||
# 处理负数
|
||||
if num < 0:
|
||||
is_negative = 1
|
||||
num = -num
|
||||
# 生成逆序数字
|
||||
while num > 0:
|
||||
rem = num % 10
|
||||
buf[i] = '0' + rem
|
||||
i += 1
|
||||
num = num / 10
|
||||
# 负号
|
||||
if is_negative:
|
||||
buf[i] = '-'
|
||||
i += 1
|
||||
# 结束符
|
||||
buf[i] = '\0'
|
||||
# 反转字符串
|
||||
start = 0
|
||||
end = i - 1
|
||||
while start < end:
|
||||
tr: t.CChar = buf[start]
|
||||
buf[start] = buf[end]
|
||||
buf[end] = tr
|
||||
start += 1
|
||||
end -= 1
|
||||
return buf
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 一个元素:存 数据指针 + 数据大小
|
||||
class Item:
|
||||
data: t.CVoid | t.CPtr # i8* 数据指针
|
||||
size: t.CSizeT # 存字节大小(用于拷贝、释放)
|
||||
|
||||
# 可变长列表
|
||||
class List:
|
||||
items: Item | t.CPtr
|
||||
count: t.CSizeT = 0
|
||||
capacity: t.CSizeT = 4
|
||||
# 初始化列表
|
||||
def __init__(self):
|
||||
# l: List | t.CPtr = malloc(List.__sizeof__())
|
||||
self.count = 0
|
||||
self.capacity = 4
|
||||
self.items = malloc(self.capacity * Item.__sizeof__())
|
||||
|
||||
# 自动扩容
|
||||
def __grow(self):
|
||||
if self.count >= self.capacity:
|
||||
self.capacity *= 2
|
||||
self.items = realloc(self.items, self.capacity * Item.__sizeof__())
|
||||
|
||||
# 添加任意类型数据(深拷贝)
|
||||
def append(self, data: t.CVoid | t.CPtr, size: t.CSizeT):
|
||||
self.__grow()
|
||||
item: Item | t.CPtr = self.items[self.count]
|
||||
item.size = size
|
||||
item.data = malloc(size + 1)
|
||||
memcpy(item.data, data, size)
|
||||
c.Set(t.CUnsignedChar(item.data + size, t.CPtr), '\0')
|
||||
self.count += 1
|
||||
|
||||
# 获取元素:返回 i8*(int8_t*),强转
|
||||
def get(self, index: t.CSizeT) -> t.CInt8T | t.CPtr:
|
||||
if index >= self.count: return None
|
||||
return self.items[index].data
|
||||
|
||||
def __getitem__(self, index: t.CSizeT) -> t.CInt8T | t.CPtr:
|
||||
return self.get(index)
|
||||
|
||||
# 销毁列表(所有内存全部释放)
|
||||
def free(self):
|
||||
i: t.CSizeT = 0
|
||||
for i in range(self.count):
|
||||
if self.items[i].data != 0:
|
||||
free(self.items[i].data)
|
||||
free(self.items)
|
||||
# free(self)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
DEFINE_T: t.CDefine = 2423432423
|
||||
|
||||
|
||||
class EnumTest(t.CEnum):
|
||||
A: t.State
|
||||
B: t.State
|
||||
C: t.State
|
||||
Len: t.State
|
||||
|
||||
|
||||
def main() -> t.CInt:
|
||||
w32.win32console.SetConsoleOutputCP(65001)
|
||||
w32.win32console.SetConsoleCP(65001)
|
||||
|
||||
d = OOPTest()
|
||||
|
||||
l = List()
|
||||
nihao = "你好!世界,这是一个可变列表"
|
||||
l.append(c.Addr(114514), t.CInt.__sizeof__())
|
||||
l.append(nihao, len(nihao))
|
||||
print("列表取值0:", c.Deref(t.CInt(l[0], t.CPtr)))
|
||||
print("列表取值1:", l.get(1))
|
||||
l.free()
|
||||
# free(l)
|
||||
print("结束")
|
||||
|
||||
# 未实现
|
||||
#a = t.CInt32T
|
||||
#print(a(-1))
|
||||
#print(type(a(-1)))
|
||||
|
||||
E: EnumTest = EnumTest.B
|
||||
print(E)
|
||||
print(EnumTest.Len)
|
||||
|
||||
print(EnumTest(1))
|
||||
print(type(EnumTest.B))
|
||||
|
||||
# c.Asm("mov eax, 1", op=[t.ASM_DESCR.CLOBBER_EAX])
|
||||
|
||||
u = Union()
|
||||
u.A.a = 114514
|
||||
u.A.b = 222222
|
||||
print("u.A.a", u.A.a)
|
||||
print("u.A.b", u.A.b)
|
||||
print("u.A.c", u.B.c) # -16558
|
||||
|
||||
wb = WBIT()
|
||||
wb.a = 1
|
||||
wb.b = 1
|
||||
wb.c = 1
|
||||
wb.d = 12
|
||||
print(wb.a)
|
||||
print(wb.b)
|
||||
print(wb.c)
|
||||
print(wb.d)
|
||||
wb.a = 2
|
||||
print(wb.a) # 10 -> 0 -> 0
|
||||
print(wb.__sizeof__())
|
||||
print(type(wb))
|
||||
|
||||
ble = BLE()
|
||||
ble.a = 0x114514
|
||||
ble.b = 0x114514
|
||||
print(ble.a)
|
||||
print(ble.b)
|
||||
print("a:", int_to_str(ble.a))
|
||||
print("a_hex:", str_to_hex(int_to_str(ble.a)))
|
||||
print(int_to_hex(ble.a[0])) # 0x00114514 00
|
||||
print(int_to_hex(ble.a[1])) # 0x00114514 11
|
||||
print(int_to_hex(ble.a[2])) # 0x00114514 45
|
||||
print(int_to_hex(ble.a[3])) # 0x00114514 14
|
||||
|
||||
print(int_to_hex(ble.b[0])) # 0x00114514 14
|
||||
print(int_to_hex(ble.b[1])) # 0x00114514 45
|
||||
print(int_to_hex(ble.b[2])) # 0x00114514 11
|
||||
print(int_to_hex(ble.b[3])) # 0x00114514 00
|
||||
|
||||
li = 0x0000000100000001
|
||||
|
||||
#bool_ = 0
|
||||
#if bool_:
|
||||
# tcls = t.CUInt32T
|
||||
#else:
|
||||
# tcls = LIWORK
|
||||
#lx = tcls(li)
|
||||
#print(type(lx))
|
||||
#print(lx.b)
|
||||
#print("END")
|
||||
#未能完全实现
|
||||
# x[-1]取值
|
||||
|
||||
print(DEFINE_T)
|
||||
if c.CIf(DEFINE_T == 2423432423):
|
||||
print("DEFINE_T == 2423432423")
|
||||
elif c.CIf(DEFINE_T == 123):
|
||||
print("DEFINE_T == 123")
|
||||
else:
|
||||
print("DEFINE_T != 2423432423 and DEFINE_T != 123")
|
||||
#c.CIf
|
||||
#c.CIfdef
|
||||
#c.CIfndef
|
||||
#c.CElif
|
||||
#c.CElse
|
||||
|
||||
class LIWORK:
|
||||
a: t.CUInt32T
|
||||
b: t.CUInt32T
|
||||
|
||||
# class Union
|
||||
class Union(t.CUnion):
|
||||
class A:
|
||||
a: t.CInt32T
|
||||
b: t.CInt32T
|
||||
class B:
|
||||
c: t.CInt16T
|
||||
d: t.CInt64T
|
||||
|
||||
class WBIT:
|
||||
a: t.CInt | t.Bit(1)
|
||||
b: t.CInt | t.Bit(1)
|
||||
c: t.CInt | t.Bit(1)
|
||||
d: t.CInt | t.Bit(5)
|
||||
|
||||
class BLE:
|
||||
a: t.CInt | t.BigEndian
|
||||
b: t.CInt | t.LittleEndian
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user