这个让我发疯:
我定义了这两个函数来在字节和 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
有任何想法吗?