2014-02-11 2 views
0

У меня есть следующий простой кадр протокола. Для тестирования я принимал фиксированное поле CRC, но теперь мне нужно добавить фактический CRC, вычисленный из предыдущих байтов в фрейме. Как это сделать? Может быть, вложенные структуры?Добавить поле CRC с использованием библиотеки python Construct

MyFrame = Struct("MyFrame", 
       ULInt8("type"), 
       ULInt8("IDMsg"), 
       ULInt8("totalPackets"), 
       ULInt8("numPacket"), 
       ULInt8("day"), 
       ULInt8("month"), 
       ULInt8("year"), 
       ULInt8("hour"), 
       ULInt8("minute"), 
       ULInt8("second"), 
       ULInt16("length"), 
       Bytes("payload", lambda ctx: (ctx.length - 14)), 
       ULInt16("crc") 
      ) 

ответ

0

Если вы хотите проверить правильность поля CRC, посмотрите на адаптер валидатора. Override _validate что-то вроде:

_validate(self, obj, context): 
    return obj.crc == crc(context.type, context.idmsg, . . .) 

Где КРР ваша функция CRC и вы подаете в остальных аргументов, используя контекст.

Если вы хотите добавить другое поле в конечный контейнер, используйте значение.

Value('calculated_crc', lambda ctx: crc(ctx.type, ctx.idmsg, . . .))