美文网首页
struct 网络字节转换

struct 网络字节转换

作者: 仙灵儿 | 来源:发表于2018-11-22 23:07 被阅读15次

属性
format
格式化字符串。
size
结构体的大小。

实例:
1.通常的打包和解包

打包和解包
import struct
import binascii

values = (1, b'good', 1.22) #查看格式化对照表可知,字符串必须为字节流类型。
s = struct.Struct('I4sf')
packed_data = s.pack(*values)
unpacked_data = s.unpack(packed_data)
  
print('Original values:', values)
print('Format string :', s.format)
print('Uses :', s.size, 'bytes')
print('Packed Value :', binascii.hexlify(packed_data))
print('Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data)

结果:

Original values: (1, b'good', 1.22)
Format string : b'I4sf'
Uses : 12 bytes
Packed Value : b'01000000676f6f64f6289c3f'
Unpacked Type : <class 'tuple'>  Value: (1, b'good', 1.2200000286102295)
[Finished in 0.1s]

说明:

首先将数据对象放在了一个元组中,然后创建一个Struct对象,并使用pack()方法打包该元组;最后解包返回该元组。
这里使用到了binascii.hexlify(data)函数。
binascii.hexlify(data)

2.使用buffer来进行打包和解包
使用通常的方式来打包和解包会造成内存的浪费,所以python提供了buffer的方式:

"""
通过buffer方式打包和解包
"""
import struct
import binascii
import ctypes
 
values = (1, b'good', 1.22) #查看格式化字符串可知,字符串必须为字节流类型。
s = struct.Struct('I4sf')
buff = ctypes.create_string_buffer(s.size)
packed_data = s.pack_into(buff,0,*values)
unpacked_data = s.unpack_from(buff,0)
  
print('Original values:', values)
print('Format string :', s.format)
print('buff :', buff)
print('Packed Value :', binascii.hexlify(buff))
print('Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data)

结果:

Original values1: (1, b'good', 1.22)
Original values2: (b'hello', True)
buff : <ctypes.c_char_Array_18 object at 0x000000D5A5617348>
Packed Value : b'01000000676f6f64f6289c3f68656c6c6f01'
Unpacked Type : <class 'tuple'>  Value: (1, b'good', 1.2200000286102295)
Unpacked Type : <class 'tuple'>  Value: (b'hello', True)
[Finished in 0.1s]

说明:
针对buff对象进行打包和解包,避免了内存的浪费。
这里使用到了函数
ctypes.create_string_buffer(init_or_size,size = None)
创建可变字符缓冲区。
返回的对象是c_char的ctypes数组。
init_or_size必须是一个整数,它指定数组的大小,或者用于初始化数组项的字节对象。

3.使用buffer方式来打包多个对象

import struct
import binascii
import ctypes
 
values1 = (1, b'good', 1.22) #查看格式化字符串可知,字符串必须为字节流类型。
values2 = (b'hello',True)
s1 = struct.Struct('I4sf')
s2 = struct.Struct('5s?')
buff = ctypes.create_string_buffer(s1.size+s2.size)
packed_data_s1 = s1.pack_into(buff,0,*values1)
packed_data_s2 = s2.pack_into(buff,s1.size,*values2)
unpacked_data_s1 = s1.unpack_from(buff,0)
unpacked_data_s2 = s2.unpack_from(buff,s1.size)
  
print('Original values1:', values1)
print('Original values2:', values2)
print('buff :', buff)
print('Packed Value :', binascii.hexlify(buff))
print('Unpacked Type :', type(unpacked_data_s1), ' Value:', unpacked_data_s1)
print('Unpacked Type :', type(unpacked_data_s2), ' Value:', unpacked_data_s2)

结果:

Original values2: (b'hello', True)
buff : <ctypes.c_char_Array_18 object at 0x000000D5A5617348>
Packed Value : b'01000000676f6f64f6289c3f68656c6c6f01'
Unpacked Type : <class 'tuple'>  Value: (1, b'good', 1.2200000286102295)
Unpacked Type : <class 'tuple'>  Value: (b'hello', True)
[Finished in 0.1s]

相关文章

  • struct 网络字节转换

    属性format格式化字符串。size结构体的大小。 实例:1.通常的打包和解包 结果: 说明: 首先将数据对象放...

  • C语言字节序转换API

    主机字节序转网络字节序 网络字节序转主机字节序 将字符串IP地址转换为网络字节序的整型数据 将网络字节序数据转换为...

  • 网络常用函数介绍

    文|Seraph 1. 字节序转换函数 在做网络数据传输时,我们经常用到以下四个字节序转换函数: 他们是网络字节顺...

  • C# 类型

    将字节数组转换为int 从网络读取字节后,可能需要将字节转换为内置类型。示例演示了如何使用 BitConvert ...

  • 从最简单的httpServer开始

    struct sockaddr_in 其中,port和sin_addr为网络字节序,hton() 常用于 等函数的...

  • 《Linux高性能服务器编程》

    小端字节序被称为主机字节序 大端字节序被称为网络字节序 长整型函数通常用来转换IP地址,短整型函数用来转换端口号 ...

  • python浮点数网络字节序编码

     使用python的struct模块,将浮点数据编码成网络字节序,便于在网络进行数据交换。 byte_codec....

  • Golang 的 “omitempty” 关键字略解

    json和struct转换简单介绍 熟悉 Golang 的朋友对于 json 和 struct 之间的转换一定不陌...

  • IOS面试题 --- 结构体相关

    问题1: 针对下面结构体 , 内存占用多少字节?struct Struct1{char a;int b;short...

  • 内存对齐

    示例代码: struct StudentOne { char a; //1字节 double b; //8字节 i...

网友评论

      本文标题:struct 网络字节转换

      本文链接:https://www.haomeiwen.com/subject/qqtdqqtx.html