2009年3月17日星期二

在python中解析带符号24位数

如何在python中将S24(带符号24位数)从二进制数解析出来?这个问题困扰了我一个上午,终于在吃午饭前解决了~

来讲讲思路。首先是用struct.unpack将整个B1(PVT)数据块分为一个个的word,其他的U8、U16、U32、S32等2的整数次幂都好办,就是碰到S24时有点麻烦,没有直接对应的数据类型,要用间接的方法来解析数值。我采用的方法是用三个Byte来存储S24的从低到高的三个字节,然后分别左移高两位字节(一个左移8位,一个左移16位),再拼成一个完整的无符号整数(用或运算),用struct.pack包装成的字节流(就是一个字符串),然后判断是正数还是负数,如果是负数要将最高一个字节改为0xff。再用struc.unpack来解包,注意此时是作为带符号整数来解包的!这样就得到了S24的值。

说了这么多,看一下代码就清楚了~


def parseS24(self,c0,c1,c2):
s = struct.pack('<I',c0|c1<<8|c2<<16)
if c2>0x7f:
ss = list(s)
ss[3] = '\xff'
s = "".join(ss)
result = struct.unpack('<i',s)[0]
return result

def w10(self):
c0 = self.data[11]
c1 = self.data[12]
c2 = self.data[13]
result = self.parseS24(c0,c1,c2)
return result


完整的代码在下面~



没有评论: