python struct unpack: Int PIN;字符验证; time_t time_second;字符状态;
python struct unpack: Int PIN; char verified; time_t time_second; char status;
我正在尝试从通过 UDP 从考勤时钟设备 (DeviceName=TA8020) 接收到的二进制数据中解压以下结构:
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 和时间戳是正确的,但我无法获得 char verified 和 char status 的正确值,正如您看到的那样解包结构,它们返回空。
当尝试像这样分别解压缩 char 状态和 char 验证时:
state = unpack('>3c',attendancedata[17:20])
space = unpack('>2c',attendancedata[21:23])
产量:
statem ('\x00', '\x00', '\x00')
statev 0
每次都是不正确的值。(通过查看考勤设备的Web界面日志验证)
像这样打开包装:
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','h\x1b\xe0\x1e','\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00')
API文档给出的细节如下:
只有读取命令才能读取所有考勤日志。考勤日志可以长压缩或短压缩。压缩方式(如果现在正在读取char *Buffer,手会在第一个字节)为:前2个字节用于存储用户密码(U 16 PIN),第三个字节的前三位用于用于存储验证状态。第四、五位存放校验方法。第六位存放短时间和长时间标志。如果是短时间格式,则时间值是第三个字节的最后两位加上最近的长时间值(因此时间格式存储为前一个长时间值的错位值)。然后根据时间编码方式(参考用户自定义编码方式)解码得到正确的时间。
如有任何帮助,我们将不胜感激。
好的,我明白了:
state = unpack('c',attendancedata[29:30])
是我需要的值。
我正在尝试从通过 UDP 从考勤时钟设备 (DeviceName=TA8020) 接收到的二进制数据中解压以下结构:
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 和时间戳是正确的,但我无法获得 char verified 和 char status 的正确值,正如您看到的那样解包结构,它们返回空。
当尝试像这样分别解压缩 char 状态和 char 验证时:
state = unpack('>3c',attendancedata[17:20])
space = unpack('>2c',attendancedata[21:23])
产量:
statem ('\x00', '\x00', '\x00')
statev 0
每次都是不正确的值。(通过查看考勤设备的Web界面日志验证)
像这样打开包装:
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','h\x1b\xe0\x1e','\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00')
API文档给出的细节如下:
只有读取命令才能读取所有考勤日志。考勤日志可以长压缩或短压缩。压缩方式(如果现在正在读取char *Buffer,手会在第一个字节)为:前2个字节用于存储用户密码(U 16 PIN),第三个字节的前三位用于用于存储验证状态。第四、五位存放校验方法。第六位存放短时间和长时间标志。如果是短时间格式,则时间值是第三个字节的最后两位加上最近的长时间值(因此时间格式存储为前一个长时间值的错位值)。然后根据时间编码方式(参考用户自定义编码方式)解码得到正确的时间。
如有任何帮助,我们将不胜感激。
好的,我明白了:
state = unpack('c',attendancedata[29:30])
是我需要的值。