0

这个让我发疯:

我定义了这两个函数来在字节和 int 之间进行转换。字节和位:

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

有任何想法吗?

4

0 回答 0