2013-05-29 1 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' 

Так что я читаю значение в виде строки, но я думал, чтение файла, как гб еще не вызвало бы эту проблему, она считывает значение как строку.

Btw, это работает в питона

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

Как это исправить? Большое спасибо за ваше время. & help.

+0

Вы можете наложить строку на long 'long (float (ut))', а затем выполнить побитовый оператор – karthikr

ответ

1

ОБНОВЛЕНИЕ: Добавлена ​​базовая конверсия 16 в длинное!

Выполнение операции & на разных типах данных. Перед тем, что вы должны преобразовать чтения string в long тип данных, как это:

# 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

FYI, отредактирован, потому что блок кода пропустил файл открытым. – thegrinner

Смежные вопросы