拓冰建站拓冰建站
首页 / 资讯中心 / 正文

海萤物联网教程:sbc:基于python的C语言格式结构体和二进制转换库

文章目录海萤物联网教程sbc基于python的C语言格式结构体和二进制转换库介绍开源Python和C对应类型使用说明示例海萤物联网教程sbc基于python的C语言格式结构体和二进制转换库本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.在线文档地址介绍sbc: struct convert binary.C语言格式结构体和二进制转换库.本软件包已上传到pypi,可输入命令直接安装:pipinstallsbc开源github上的项目地址gitee上的项目地址Python和C对应类型本软件包封装了ctypes,支持cytpes所有类型,对应表如下:cyteps typeCtypePython typec_bool_Boolbool (1)c_charchar1-character bytes objectc_wcharwchar_t1-character stringc_bytecharintc_ubyteunsigned charintc_shortshortintc_ushortunsignedshort intc_intintintc_uintunsigned intintc_longlongintc_ulongunsigned longintc_longlong__int64 or long longintc_ulonglongunsigned __int64 or unsigned long longintc_size_tsize_tintc_ssize_tssize_t or Py_ssize_tintc_floatfloatfloatc_doubledoublefloatc_longdoublelong doublefloatc_char_pchar * (NUL terminated)bytes object or Nonec_wchar_pwchar_t * (NUL terminated)string or Nonec_void_pvoid *int or None使用说明软件包支持4种C语言结构类名说明LEFormat1字节对齐的小端结构体LEFormatAlign44字节对齐的小端结构体LEFormatAlign88字节对齐的小端结构体BEFormat1字节对齐的大端结构体BEFormatAlign44字节对齐的大端结构体BEFormatAlign84字节对齐的大端结构体定义C语言结构体需继承对应的结构体,然后在_fields_中定义对应的成员。示例:classTStruct1(sbc.LEFormat):_fields_[# (字段名, c类型)(a,sbc.c_uint32),(b,sbc.c_int16),(c,sbc.c_uint8),]C结构体转换为二进制字节流使用方法encode,二进制字节流转换为C语言结构体使用方法decode.API: C语言格式结构体转换成二进制 :return: 返回二进制字节流 defstruct_to_bytearray(self)-bytearray 二进制转换成C语言结构体 :return: 返回True表示转换成功,False表示转换失败 defbytearray_to_struct(self,data:bytearray)-bool 读取结构体字节数 defsize(self)-int示例importsbcimportunittestclassTStruct1(sbc.LEFormat):_fields_[# (字段名, c类型)(a,sbc.c_uint32),(b,sbc.c_int16),(c,sbc.c_uint8),]classTStruct2(sbc.LEFormatAlign4):_fields_[# (字段名, c类型)(a,sbc.c_uint32),(b,sbc.c_int16),(c,sbc.c_uint8),]classTStruct3(sbc.BEFormat):_fields_[# (字段名, c类型)(a,sbc.c_uint16),(b,sbc.c_uint8*5),(c,sbc.c_uint32),]class_UnitTest(unittest.TestCase):deftest_case1(self): 测试小端1字节对齐,C语言结构体转换为二进制 tsTStruct1()ts.a0x12345678ts.b0x2345ts.c0x67datats.struct_to_bytearray()self.assertEqual(len(data),7)self.assertEqual(data,bytearray([0x78,0x56,0x34,0x12,0x45,0x23,0x67]))deftest_case2(self): 测试小端1字节对齐,二进制转换为C语言结构体 tsTStruct1()ts.bytearray_to_struct(bytearray([0x78,0x56,0x34,0x12,0x45,0x23,0x67]))self.assertEqual(ts.a,0x12345678)self.assertEqual(ts.b,0x2345)self.assertEqual(ts.c,0x67)deftest_case3(self): 测试小端4字节对齐,C语言结构体转换为二进制 tsTStruct2()ts.a0x12345678ts.b0x2345ts.c0x67datats.struct_to_bytearray()self.assertEqual(len(data),8)self.assertEqual(data,bytearray([0x78,0x56,0x34,0x12,0x45,0x23,0x67,0x00]))deftest_case4(self): 测试小端4字节对齐,二进制转换为C语言结构体 tsTStruct2()ts.bytearray_to_struct(bytearray([0x78,0x56,0x34,0x12,0x45,0x23,0x67,0x00]))self.assertEqual(ts.a,0x12345678)self.assertEqual(ts.b,0x2345)self.assertEqual(ts.c,0x67)deftest_case5(self): 测试小端4字节对齐,二进制转换为C语言结构体 tsTStruct2()errts.bytearray_to_struct(bytearray([0x78,0x56,0x34]))self.assertEqual(err,False)deftest_case6(self): 测试大端1字节对齐,C语言结构体转换为二进制 tsTStruct3()ts.a0x2345foriinrange(5):ts.b[i]i ts.c0x12345678datats.struct_to_bytearray()self.assertEqual(len(data),11)self.assertEqual(data,bytearray([0x23,0x45,0x00,0x01,0x02,0x03,0x04,0x12,0x34,0x56,0x78]))defprint_hex(data):foriindata:print(%x%i,end )print()if__name____main__:suiteunittest.TestSuite()runnerunittest.TextTestRunner()runner.run(suite)
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门