0

これは私を夢中にさせています:

これら 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'、そうではありません''

私もチェックdeviceIDdataType__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