在Python 2.4.3中使用Pack而不是Pack_into

时间:2016-04-23 14:26:09

标签: python

以下代码用于模拟嵌入式设备上的Modbus接口。不幸的是,它有一个较旧的Python(2.4.3)。代码适用于2.7,但不适用于2.4.3,因为我使用的Python版本不支持struct.pack_into,只支持struct.pack。我可以就如何解决这个问题得到一些建议吗?我想我可能需要使用字符串并转换为字节缓冲区。这与非Python代码有关,因此我认为不能使用pickle。

import socket
import sys
import array
import struct

def hexdump(src, length=16):
    FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)])
    lines = []
    for c in xrange(0, len(src), length):
        chars = src[c:c+length]
        hex = ' '.join(["%02x" % ord(x) for x in chars])
        printable = ''.join(["%s" % ((ord(x) <= 127 and FILTER[ord(x)]) or '.') for x in chars])
        lines.append("%04x  %-*s  %s\n" % (c, length*3, hex, printable))
    return ''.join(lines)

HOST = '192.168.1.187'
PORT = 502
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)
conn, addr = s.accept()
data = []
datatran = array.array('B', '\x00' * 14)
data = conn.recv(1024)
print 'Connect by', addr
while (data):
    sys.stdout.write(hexdump(data))
    TransID , ProtoColID, PacketLength, UnitID, FC, StartAddress, RegisterCount = struct.unpack_from(">hhhBBhh", data)
    print TransID, ProtoColID, PacketLength, UnitID
    print  FC, StartAddress, RegisterCount
    struct.pack_into(">hhhBBBh", datatran, 0, TransID , ProtoColID, PacketLength+2, UnitID, FC, 2, 51)
    conn.sendall(datatran)
    data = conn.recv(1024)

conn.close()
s.close()

由于

1 个答案:

答案 0 :(得分:0)

通过一些大小计算,应该可以使用packunpack代替:

import socket
import sys
import array
import struct

def hexdump(src, length=16):
    FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)])
    lines = []
    for c in xrange(0, len(src), length):
        chars = src[c:c+length]
        hex = ' '.join(["%02x" % ord(x) for x in chars])
        printable = ''.join(["%s" % ((ord(x) <= 127 and FILTER[ord(x)]) or '.') for x in chars])
        lines.append("%04x  %-*s  %s\n" % (c, length*3, hex, printable))
    return ''.join(lines)

HOST = '192.168.1.187'
PORT = 502
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)
conn, addr = s.accept()
datatranStruct = '>hhhBBBh'
datatranStructSize = struct.calcsize(datatranStruct)
datatranFormat = '%s%dx' % (datatranStruct, 14 - datatranStructSize)
recvStruct = '>hhhBBhh'
recvStructSize = struct.calcsize(recvStruct)
data = conn.recv(1024)
print 'Connect by', addr
while (data):
    sys.stdout.write(hexdump(data))
    recvFormat = '%s%dx' % (recvStruct, len(data) - recvStructSize)
    TransID , ProtoColID, PacketLength, UnitID, FC, StartAddress, RegisterCount = struct.unpack(recvFormat, data)
    print TransID, ProtoColID, PacketLength, UnitID
    print  FC, StartAddress, RegisterCount
    datatran = struct.pack(datatranFormat, TransID , ProtoColID, PacketLength+2, UnitID, FC, 2, 51)
    conn.sendall(datatran)
    data = conn.recv(1024)

conn.close()
s.close()