python struct unpack:Int PIN; char已验证; time_t time_second; char status;

时间:2016-02-13 13:53:22

标签: python struct binary-data unpack time-and-attendance

我正在尝试从时间考勤时钟设备(DeviceName = TA8020)通过UDP接收的二进制数据中解压缩以下结构:

 typedef struct _AttLog_{
 Int PIN; //U16 PIN, user number
 char verified;// verifying method
 time_t time_second; //time, time code is user-defined time code.
 char status;// attendance state
 }TAttLog, *PAttLog;

尝试解压缩数据:

uid, state, timestamp, space = unpack( '24s1s4s11s', attendancedata.ljust(40)[:40] )
print "%s, %s, %s, %s" % (uid, state, space, decode_time( int( reverseHex( timestamp.encode('hex') ), 16 ) ) )

产生以下结果:

5, ,   , 2016-02-13 11:55:36

uid和timestamp是正确的,但我无法获得char验证和char状态的正确值,因为您可以看到解压缩结构如上所示它们将被返回为空。

当尝试解压缩char状态并且char分别验证时:

state = unpack('>3c',attendancedata[17:20])
space = unpack('>2c',attendancedata[21:23])

的产率:

statem ('\x00', '\x00', '\x00')
statev 0

每次都不是正确的值。(通过查看考勤设备的网络界面日志进行验证)

解压缩如:

oneSet = unpack('24s1s4s11s',attendancedata.ljust(40)[:40])

收率:          ( '5 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00' '\ X01',1 H \ X1B \ xe0 \ X1E', '\ X01 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ XB2 \ X00')

API文档提供了以下详细信息:

只有read命令可用于读取所有考勤日志。出勤日志可以在长或短模式下压缩。压缩方法(如果现在正在读取char * Buffer,则指针将位于第一个字节)是:前2个字节用于存储用户PIN(U 16 PIN),使用第3个字节的前3位用于存储验证状态。第四和第五位用于存储验证方法。第六位是存储短期和长期的标志。如果是短时格式,则时间值是第三字节的最后两位和第三字节加上最近的长时间值(因此,时间格式被存储为前一长时间值的重合失调值)。然后根据时间编码模式对其进行解码(参考用户定义的编码模式)以获得正确的时间。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的我明白了:

state = unpack('c',attendancedata[29:30])

是我需要的价值。