模塊和包.struct

簡單介紹: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

相關文章
相關標籤/搜索