2013-05-29 61 views
0

我想从文件中读取像这样的十六进制值并执行一些操作。Python文件十六进制操作

REVA: XA0 DID0, DF= Q8B8, Rev: 0.0, UT: 0xd2d32103800600 : Cbos: 18 (0x0) 

我想读取UT并对其执行以下操作。

x=ut & 0xFFFFFFFF 
y=(ut>>32) & 0xFFFFFF 

我的代码如下─

f=open('utinfo', 'rb') 

for line in f: 
    if line.startswith("REVA"): 
     ut=line.split()[8] #grabs the value 0xd2d32103800600 
    x = ut & 0xFFFFFFFF 
    y = (ut>>32) & 0xFFFFFF 

我得到它是 -

 x = ut & 0xFFFFFFFF 
TypeError: unsupported operand type(s) for &: 'str' and 'long' 

所以我读值作为一个字符串,但我认为读文件RB错误不会导致这个问题,但它正在读取字符串的值。

顺便说一句,这部作品在蟒蛇

>>?ut=0x2d32103800600 
>>? x=ut & 0xFFFFFFFF 
>>?x 
0x3800600L 
>>? y= ut>>32 & 0xFFFFFF 
>>?y 
>>?0x0L 

我该如何解决这个问题?非常感谢您的时间&帮助。

+0

你可以将字符串强制转换为long long(float(ut)),然后执行位运算符 – karthikr

回答

1

更新:增加了16个长转换!

您对不同的数据类型执行&操作。这样做,你必须转换之前阅读stringlong数据类型是这样的:

# at this moment ut data type is string 
ut=line.split()[8] #grabs the value 0xd2d32103800600 
# convert string to long data type, set base 16 
ut = long(ut, 16) 

之后,你可能会继续执行代码:

x = ut & 0xFFFFFFFF 
y = (ut>>32) & 0xFFFFFF 

全码:

f=open('utinfo', 'rb') 
for line in f: 
    if line.startswith("REVA"): 
     ut=line.split()[8] #grabs the value 0xd2d32103800600 
     ut=long(ut,16) 
    x = ut & 0xFFFFFFFF 
    y = (ut>>32) & 0xFFFFFF 

希望这有助于!

+2

不应该明确地设置基数ut = long(ut,16)''' – oleg

+0

谢谢很多支持!确实有必要,我完全忘记了这一点。修复了答案。再次感谢:) –

+1

仅供参考,编辑是因为代码块错过了打开的文件。 – thegrinner