Python 为什么在我打印deviceID时将其设置为空字符串?
这件事快把我逼疯了: 我定义了这两个函数在字节和int resp之间进行转换。字节和位:Python 为什么在我打印deviceID时将其设置为空字符串?,python,binary,bitset,Python,Binary,Bitset,这件事快把我逼疯了: 我定义了这两个函数在字节和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) 这与预期的效果一样:
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: invalid literal for int() with base 2: ''
虽然deviceID
肯定是一个字符串(我以前使用它作为字符串并将其打印出来)'00001'
,但它不是'
我还用\uu doc\uu
检查了deviceID
和dataType
,它们是字符串
这一个在控制台中运行良好:
>>> 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
有什么想法吗?请注意,
ord()
将字节转换为整数的效率要高得多。错误消息告诉您出了什么问题:您正在传递一个空字符串。你的问题不应该是“为什么int()
不能解析一个完美的二进制整数?”,因为int()
显然可以做到这一点;它应该是“为什么在打印时deviceID
设置为空字符串?”@MartijnPieters,我知道,但只在字符上,而不是字符串上。我想。编码对于字符串来说是可以的…@kindall是的,你是对的;)thanks@septi:啊,是的,在这种情况下,您确实希望使用struct
模块。:-)