2012-02-07 47 views
4

我需要Python的模拟这个Perl的字符串:解压格式字符在Python

unpack("nNccH*", string_val) 

我需要nNccH* - 在Python中字符格式的数据格式。

在Perl它解压缩的二进制数据,以五个变量:在 “网络”(大端) “网络” 在

  • 32位值(大端)
    • 16位值符号字符(8位整数)值
    • 符号字符(8位整数)值
    • 十六进制串,高半字节先

    但我不能这样做在Python

    更多:

    bstring = '' 
    while DataByte = client[0].recv(1): 
        bstring += DataByte 
    print len(bstring) 
    if len(bstring): 
        a, b, c, d, e = unpack("nNccH*", bstring) 
    

    我从来没有在Perl或Python写的,但我现在的任务是写这是用Perl编写的多线程Python的服务器.. 。

  • +0

    我能找到除了H *之外的所有其他东西,我假设你会玩P或S。 – 2012-02-07 12:52:24

    +0

    您将需要计算字符串大小,这个答案可能会有所帮助。 http://stackoverflow.com/a/5849224/70350 – pojo 2012-02-07 12:54:16

    +0

    ' “而数据字节=客户端[0] .recv(1):”'是不Python的。这是行不通的。 – 2012-02-07 13:17:19

    回答

    7

    Perl的格式"nNcc"相当于Python的格式"!HLbb"。 Perl的"H*"在Python中没有直接的等价物。

    有两个问题。

    • Python的struct.unpack不接受通配符,*
    • Python的struct.unpack不“hexlify”数据串

    第一个问题可以用一个辅助函数一样unpack围绕工作 - 。

    第二个问题可以利用binascii.hexlify解决:

    import struct 
    import binascii 
    
    def unpack(fmt, data): 
        """ 
        Return struct.unpack(fmt, data) with the optional single * in fmt replaced with 
        the appropriate number, given the length of data. 
        """ 
        # http://stackoverflow.com/a/7867892/190597 
        try: 
         return struct.unpack(fmt, data) 
        except struct.error: 
         flen = struct.calcsize(fmt.replace('*', '')) 
         alen = len(data) 
         idx = fmt.find('*') 
         before_char = fmt[idx-1] 
         n = (alen-flen)//struct.calcsize(before_char)+1 
         fmt = ''.join((fmt[:idx-1], str(n), before_char, fmt[idx+1:])) 
         return struct.unpack(fmt, data) 
    
    data = open('data').read() 
    x = list(unpack("!HLbbs*", data)) 
    # x[-1].encode('hex') works in Python 2, but not in Python 3 
    x[-1] = binascii.hexlify(x[-1]) 
    print(x) 
    

    当在由此Perl脚本产生的数据进行测试:

    $line = pack("nNccH*", 1, 2, 10, 4, '1fba'); 
    print "$line"; 
    

    的Python脚本产生

    [1, 2, 10, 4, '1fba'] 
    
    +1

    +1,这个答案应该被接受:) – 2012-02-07 13:35:31

    +0

    'binascii.hexlify()'的替代方法是'str.encode(“hex”)''。 – 2012-02-07 13:48:53

    +0

    谢谢sooo多! – 2012-02-07 13:53:59

    6

    你要找的等效Python的功能是struct.unpack。格式字符串的文件是在这里:http://docs.python.org/library/struct.html

    你必须得到帮助,如果你确实说明你需要什么样的拆包一个更好的机会。不是每个人都知道Perl。

    +0

    谢谢。我已经阅读了perl和python解包文档。但到目前为止,我不明白一些时刻。 – 2012-02-07 12:40:34

    +0

    @Eli - 直接翻译可能会遇到小问题。例如,如何在python中做H *?我猜,用户本可以更好地回答这个问题。 – 2012-02-07 12:46:16

    +0

    @SenthilKumaran:请注意,用户在我的回答后编辑了问题*。编辑之前,他没有在Perl – 2012-02-07 13:01:55