2016-09-22 49 views
0

我試圖從val類構造與元件value的可變大小的數據結構的結構:如何構建具有可變大小要素

from construct import * 

TEST = Struct("test", 
      UInt8("class"), 
      Embed(switch(lambda ctx: ctx.class) { 
      1: UInt8("value"), 
      2: UInt16("value"), 
      3: UInt32("value")} 
      )) 
     ) 

上面的代碼是不正確。

我需要這樣做:如果類是1,那麼將從數據包接收一個字節。

回答

0

您可以使用多個format string改變struct行爲和struct.unpack_fromstruct.calcsize繼續從最後發現字節序列的最後字節組解析:

import struct 
v1 = bytearray([0x00,0xFF]) 
v2 = bytearray([0x01,0xFF,0xFF]) 
v3 = bytearray([0x02,0xFF,0xFF,0xFF,0xFF]) 

v = v2 # change this 

header_format = 'B' 
body_format_variants = {0:'B',1:'H',2:'L'} 

header = struct.unpack_from(header_format,v,0) 
body = struct.unpack_from(body_format_variants[header[0]],v,struct.calcsize(header_format)) 

print (header, body, "size=",struct.calcsize('>'+header_format+body_format_variants[header[0]])) 
相關問題