首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将c_byte-array转换为不同的类型

将c_byte-array转换为不同的类型
EN

Stack Overflow用户
提问于 2019-05-02 22:29:54
回答 1查看 112关注 0票数 0

我正在尝试在Python语言中将c_byte数组转换为不同的数据类型,例如,将一个包含八个条目的c_byte数组转换为int64或double。

在我的项目中,我读取了一个包含多个具有不同数据类型的传感器值的长c_byte数组(n>500)。因此,可能第一个条目是布尔值,第二个和第三个条目表示int8,条目4-11存储双精度值。我正在寻找一种方便的方法来将这些数组条目转换为所需的数据类型。

目前,我正在将字节数组转换为包含二进制数的字符串。我正在考虑手动编写函数来将这些字符串转换为浮点数和整数,但我希望有一种更优雅的方法。另外,我在转换带符号的整数时也遇到了问题...

代码语言:javascript
复制
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'

我找到了bitstring库,它的功能与我想要的非常相似。不幸的是,我没有发现任何对64位整数或双精度浮点数的支持。

理想情况下,我应该有一组函数可以将ctypes.c_byte-array转换为相应的ctypes-type。

EN

回答 1

Stack Overflow用户

发布于 2019-05-04 09:01:03

struct库就是为此而设计的。

下面是一个简短的示例。值'<?2b8d'表示:

  • < little-endian
  • ? bool
  • 2b两个1字节带符号的int.
  • 8d 8双精度。

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55954649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档