简单介绍:python
此模块儿经常使用于将某种特定的结构体类型打包成二进制流的字符串而后在网络上传输,接收端而后经过某种机制进行解包还原出原始的结构体数据,struct就提供了这样的机制git
格式符号:数组
经常使用方法:网络
struct.pack(fmt, v1, v2, ...) -> stringapp
说明:将Python的值根据如上格式符转换为字符串(由于Python中没有字节类型),能够把这些字符串理解为字节流或是字节数组less
common_data.pysocket
# -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://my.oschina.net/pydevops/ # Purpose: # """ # 查询StatusHelper状态是否正常 statushelper_isalive = '''15 20 00 b0 61 63 61 38 35 33 33 34 31 31 31 36 34 65 39 36 2C 30 32 64 32 30 35 33 35 31 32 30 37 38 62 61 35 2C 30 36 37 37 34 65 64 64 34 66 63 36 39 37 66 61 2C 30 61 30 37 64 61 32 34 34 66 62 35 39 64 30 61 2C 38 63 61 33 66 64 66 32 65 64 39 62 66 32 64 66 2C 36 35 64 37 33 35 36 35 39 31 63 33 38 30 65 36 00''' if __name__ == '__main__': print statushelper_isalive
main.py函数
# -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://my.oschina.net/pydevops/ # Purpose: # """ import string import socket import struct import blessings from common_data import statushelper_isalive # 转换为二进制字节流 def struct_pack(hex_strs): """Pack hex_strs to strs Args: hex_strs: hex string Returns: string """ all_strs = '' hex_strs = hex_strs.replace('\n', ' ') hex_list = hex_strs.split() for cur_item in hex_list: # 十六进制转换为10进制而后在组包二进制字节流 all_strs += struct.pack('B', int(cur_item, 16)) return all_strs def main(): """Main function.""" addr_info = ('x.x.x.x', 8777) # 全局超时 socket.setdefaulttimeout(5) socket_handler = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 组包 socket_strings = struct_pack(statushelper_isalive) print repr(socket_strings) # 改包 socket_strings = socket_strings.replace('0a07da244fb59d0a', '0a07da244fb59d0a') # 发包 socket_handler.sendto(socket_strings, addr_info) # 格式输出 head_format = '%-*s%-*s' server_width = 20 serial_width = int(TERMINAL.width) - 2 - server_width print '='*int(TERMINAL.width) print head_format % (serial_width, 'SerialNumber', server_width, 'NatServer/StatusHelp') print '='*int(TERMINAL.width) # 遍历字节流 res_list = [] chr_strs = '.'.join([string.lowercase, string.digits]) while True: try: cur_data, _ = socket_handler.recvfrom(1024) for cur_chr in cur_data: if cur_chr in chr_strs: res_list.append(cur_chr) serial_num = ''.join(res_list[:16]) newnatserver = ''.join(res_list[16:]) print head_format % (serial_width, serial_num, server_width, newnatserver) del res_list[:] except socket.timeout: break if __name__ == '__main__': TERMINAL = blessings.Terminal() main()
struct.unpack(fmt, string) -> tuplespa
说明:将字节流转换为Python数据类型,该函数返回一个元祖.net