python - 将 c_byte-array 转换为不同的类型
问题描述
我正在尝试将 c_byte 数组转换为 Python 中的不同数据类型,例如将八项 c_byte 数组转换为 int64 或 double。
在我的项目中,我读取了一个长 c_byte 数组 (n>500),其中包含具有不同数据类型的多个传感器值。所以也许第一个条目是一个布尔值,第二个和第三个条目代表一个 int8,条目 4-11 存储一个双精度。我正在寻找一种将这些数组条目转换为所需数据类型的便捷方法。
目前,我正在将字节数组转录为包含二进制数的字符串。我正在考虑手动编写函数来将这些字符串转换为浮点数和整数,但我希望有一种更优雅的方法。另外,我在转换有符号整数时遇到问题......
def convert_byte_to_binary(array):
binary = ''
for i in array:
binary += format(i, '#010b')[2:]
return binary
def convert_binary_to_uint(binary):
return int(binary, 2)
array = read_cbyte_array(address, length) # reads an array of size length, starting at address
array
[15, 30, 110, 7, 65]
convert_byte_to_binary(array)
'0000111100011110011011100000011101000001'
我找到了位串库,它的功能与我想要的非常相似。不幸的是,我没有找到任何对 64 位整数或双浮点数的支持。
理想情况下,我会有一组函数可以将 ctypes.c_byte-array 转换为相应的 ctypes-types。
解决方案
结构库就是为此而设计的。
这是一个简短的例子。该值'<?2b8d'
代表:
<
小端?
布尔2b
两个 1 字节有符号整数。8d
八双。
import ctypes
import struct
# Build the raw data
org_data = struct.pack('<?2b8d',True,-1,2,1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8)
print(org_data)
# Just to demo using a c_byte array...
byte_data = (ctypes.c_byte * len(org_data))(*org_data)
print(byte_data)
# convert to the original data
data = struct.unpack('<?2b8d',byte_data)
print(data)
输出:
b'\x01\xff\x02\x9a\x99\x99\x99\x99\x99\xf1?\x9a\x99\x99\x99\x99\x99\x01@ffffff\n@\x9a\x99\x99\x99\x99\x99\x11@\x00\x00\x00\x00\x00\x00\x16@ffffff\x1a@\xcd\xcc\xcc\xcc\xcc\xcc\x1e@\x9a\x99\x99\x99\x99\x99!@'
<__main__.c_byte_Array_67 object at 0x0000025D4066B0C8>
(True, -1, 2, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8)
推荐阅读
- byte - Raku 中的 `bytes.fromhex` 和 `to_bytes` 方法?
- javascript - 测试 Vuejs EventBus
- elasticsearch - 如何在 gcp 中设置弹性健康检查警报
- flutter - 如何在没有动画的情况下将 FloatingActionButton.Extended 从扩展更改为折叠?
- key - 如何确定关系中的候选键?
- vuejs3 - 在 vue3 中将数据从子级发送到父级
- javascript - 访问对象中单个函数内的多个函数
- java - 来电者姓名未在 Android 9 及更高版本中宣布联系人/来电者姓名
- unity3d - unity 横幅广告 admob v5.3.0 不显示
- java - 无法将分支部署到 Heroku