为什么我在打印时将deviceID设置为空字符串?

时间:2013-05-06 16:33:03

标签: python binary bitset

这个让我发疯:

我将这两个函数定义为在bytes和int resp之间进行转换。字节和位:

def bytes2int(bytes) : return int(bytes.encode('hex'), 16)

def bytes2bits(bytes) : # returns the bits as a 8-zerofilled string
    return ''.join('{0:08b}'.format(bytes2int(i)) for i in bytes)

这可以按预期工作:

>>> bytes2bits('\x06')
'00000110'

现在我正在读取二进制文件(具有良好定义的数据结构)并打印出一些值,这也是有效的。这是一个例子:

从文件中读取字节的代码:

dataItems = f.read(dataSize)
for i in range(10) : // now only the first 10 items
    dataItemBits = bytes2bits(dataItems[i*6:(i+1)*6]) // each item is 6 bytes long
    dataType = dataItemBits[:3]
    deviceID = dataItemBits[3:8]
    # and here printing out the strings...
    # ...
    print("   => data type: %8s" % (dataType))
    print("   => device ID: %8s" % (deviceID))
    # ...

使用此输出:

-----------------------
Item #9: 011000010000000000111110100101011111111111111111
    97   bits: 01100001
     0   bits: 00000000
    62   bits: 00111110
   149   bits: 10010101
   255   bits: 11111111
   255   bits: 11111111

 =>  data type:      011  // first 3 bits
 =>  device ID:    00001  // next 5 bits

我的问题是,我无法将'位串'转换为十进制数;如果我试着打印这个

print int(deviceID, 2)

它给了我一个ValueError

ValueError: invalid literal for int() with base 2: ''

虽然deviceID绝对是一个字符串(我之前使用它作为字符串并将其打印出来)'00001',所以它不是''

我还使用deviceID检查了dataType__doc__,它们是字符串。

这个在控制台中运行良好:

>>> int('000010', 2)
2
>>> int('000110', 2)
6

这里发生了什么?

更新

这真的很奇怪:当我将它包装在try / except块中时,它会打印出正确的值。

try :
    print int(pmtNumber, 2) // prints the correct value
except :
    print "ERROR!" // no exception, so this is never printed

有什么想法吗?

0 个答案:

没有答案