簡體   English   中英

Python ctypes union,string,str,byte:三個Python,三個不同的結果

[英]Python ctypes union, string, str, byte: three Pythons, three different results

要求一位同事為我可以適應客戶需求的套接字客戶端和服務器應用程序提供一個起點。 他提供的東西比我想象的要好得多,並且為我提供了關於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”。 在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 = '#'

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

self.Initialize = b' ' * 49

如果將文本分配給Message ,以使用非ASCII,則可以使用Unicode字符串,但可以使用適當的編碼將其編碼為字節字符串:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM