以处理CAN数据帧为例,在Python中对VCI_CAN_OBJ的封装如下:
class VCI_CAN_OBJ(Structure):
_fields_ = [('ID', c_uint), # 报文ID,靠右对齐
("TimeStamp", c_uint), # 时间戳,计时单位为 0.1ms
("TimeFlag", c_ubyte), # 是否使用时间戳
('SendType', c_ubyte), # 发送帧类型
('RemoteFlag', c_ubyte), # 是否为远程帧
('ExternFlag', c_ubyte), # 是否为拓展帧
('DataLen', c_ubyte), # 数据长度
('Data', c_ubyte * 8), # 报文数据
('Reserved', c_ubyte * 3)] # 系统保留
直接将canObj转换至十六进制字符串
其中使用了Python内建的字符串格式化处理函数 format
def canObj2hexStr(canObj):
id = "{:08x}".format(canObj.ID)
timeStamp = "{:08x}".format(canObj.TimeStamp)
timeFlag = "{:02x}".format(canObj.TimeFlag)
sendType = "{:02x}".format(canObj.SendType)
remoteFlag = "{:02x}".format(canObj.RemoteFlag)
externFlag = "{:02x}".format(canObj.ExternFlag)
dataLen = "{:02x}".format(canObj.DataLen)
data = "".join(["{:02x}".format(i) for i in list(canObj.Data)])
reserved = "".join(["{:02x}".format(i) for i in list(canObj.Reserved)])
hexStr = "%s%s%s%s%s%s%s%s%s"%(id, timeStamp, timeFlag, sendType, remoteFlag, externFlag, dataLen, data, reserved)
return hexStr
- 将十进制整数转换为hexStr(十六进制字符串)或binStr(二进制字符串)
>>> n = 123456789
>>> hexStr = "{:08x}".format(n)
>>> binStr = "{:032b}".format(n)
>>> hexStr
'075bcd15'
>>> binStr
'00000111010110111100110100010101'
- 32位无符号整型可表示的最大数值为4294967296,基于每一个十六进制位可以代表4个二进制位,故选用8位十六进制数足以容纳 n
- format 格式化输出
- 字符的对齐与填充:
{:[用于填充的ASCII字符][对齐方式][定长]}
- 填充字符:单个ASCII字符(默认填充空格)
- 对齐方式:
^
(居中)、<
(左对齐)、>
(右对齐)
- 浮点小数输出:
{:.[精度]f}
- 使用逗号分隔金额数值:
{:,}
- 数值的制定进制下显示
- 二进制:b
- 十进制:d
- 八进制:o
- 十六进制:x
- 其他
-
!s
:将对象格式化转换成字符串 -
!a
:将对象格式化转换成ASCII -
!r
:将对象格式化转换成repr
-
- 字符的对齐与填充:
提取C结构体内容字节成帧
def canObj2frame(canObj):
"""将C结构体canObj转换至字节帧"""
addr = addressof(canObj)
size = sizeof(canObj)
frame = string_at(addr,size)
return frame
将字节帧转换至十六进制字符串
def frame2hexStr(frame):
"""将字节帧转换至十六进制字符串"""
hexStr = frame.hex()
return hexStr
将十六进制字符串转换至字节帧
def hexStr2frame(hexStr):
"""将十六进制字符串转换至字节帧"""
frame = bytes.fromhex(hexStr)
return frame
顺带也提一下普通字符串与字节流之间的转换
字符串转bytes
# str object
s = "str example"
# str to bytes 字符串转字节
bytes(s, encoding="utf8")
# an alternative method
str.encode(s)
bytes转字符串
#bytes object
b = b"byte example"
# bytes to str 字节转字符串
str(b, encoding="utf-8")
# an alternative method
bytes.decode(b)
参考
在网上看到的相关优质博文:
ctypes+struct实现类c的结构化数据串行处理
使用 ctypes 进行 Python 和 C 的混合编程