Python ctypes union,string,str,byte:三个Pythons,三个不同的结果

时间:2016-01-12 17:58:14

标签: python ctypes

一位同事被要求提供套接字客户端和服务器应用程序的起点,我可以根据客户的需求进行调整。他提供了比我想象的更多的东西,并为我提供了一个很好的Python编程课程。

但他将程序定位到Python 2.7。我花了整整一段时间在这家公司试图把它拖到20世纪。 (请注意,我没有说21日。)我想使用Python 3.2(不是3.5,因为除了我之外的每个人都使用PythonWin,它赢得了3.5。我使用PyCharm)。

我的同事提供的代码使用ctypes模块的Structure和Union类。在Python 3.2中,__init__方法的第一行抛出此异常:TypeError:期望的字符串,str找到。在Python 3.5中,错误是" TypeError:期望的字节,str found。"在Python 2.7中,没有错误,代码可以工作。

这是我第一次遇到ctypes模块,当我开始这个项目时,我只遇到了Python 3。有人能告诉我我需要做些什么才能让它发挥作用吗?

以下是代码:

class AliveMsg(Structure):
    """
    """
    _pack_ = 1
    _fields_ = [("Header", MsgHeader),  # Header
                ("EndFlag", c_char * 1)]  # End Flag always '#'


class TransAlive(Union):
    length = 49

    _pack_ = 1
    _fields_ = [("Struct", AliveMsg),
                ("Message", c_char * 49),
                ("Initialize", c_char * 49)]

    def __init__(self):
        self.Initialize = ' ' * 49
        self.Struct.Header.START_FLAG = '*'
        self.Struct.Header.SEP1 = ';'
        self.Struct.Header.SEP2 = ';'
        self.Struct.Header.SEP3 = ';'
        self.Struct.Header.SEP4 = ';'
        self.Struct.Header.HEADER_END = 'Data:'
        self.Struct.EndFlag = '#'

1 个答案:

答案 0 :(得分:2)

c_char使用字节字符串而不是Unicode字符串。 Unicode字符串是Python 3中的默认字符串,但字节字符串是Python 2中的默认字符串。例如:

self.Initialize = b' ' * 49

如果您将文本分配给Message,要使用非ASCII,您可以使用Unicode字符串,但使用适当的编码将其编码为字节字符串:

self.Message = 'Some Chinese: 马克'.encode('utf8')