これは私を夢中にさせています:
これら 2 つの関数を定義して、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
私の問題は、「ビット文字列」を 10 進数に変換できないことです。これを印刷しようとすると
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
何か案は?