2017-07-31 13 views
0

私のコードを使用するときに次のエラーが発生します。このコードの私の目標は、整数入力をソケットメッセージングのバイナリデータに変換するクラスを作成することです。私はこのアプリケーションのパッキングとアンパックを理解しようとしています。どんな助けもありがとうございます。Python Struct/Packing errors

コード:

import struct 

def BinaryPacker(input1): 
    s = struct.Struct('@I') 
    pack_data = s.pack(int(input1)) 
    print 'Original values:', input1 
    print 'Format string :', s.format 
    print 'Uses   :', s.size, 'bytes' 
    return pack_data 

#BinaryUnpacker unpacks the data with small discrepancy in floating point value 
def BinaryUnpacker(input2): 
    s = struct.Struct('@I') 
    print input2 
    print 'Size of struct: ', struct.calcsize(input2) 
    unpack_data = s.unpack(input2) 
    print 'Unpacked Values:', unpack_data 
    print unpack_data[0] 
    print '\n' 

while True: 
    print ("Message to pack n unpack:") 
    message = raw_input() 
    message = BinaryPacker(message) 
    BinaryUnpacker(message) 

エラー1:9が動作するように見えるが、少数を< 10が表示さを使用していくつかの理由の代わりに、文字列の文字として解釈されます。

Message to pack n unpack: 
5 
Original values: 5 
Format string : @I 
Uses   : 4 bytes 

Size of struct: 
Traceback (most recent call last): 
    File "C:\PythonPractice\BinaryPacker.py", line 43, in <module> 
    BinaryUnpacker(message) 
    File "C:\PythonPractice\BinaryPacker.py", line 33, in BinaryUnpacker 
    print 'Size of struct: ', struct.calcsize(input2) 
struct.error: bad char in struct format 

エラー2:入力2を整数に変換しようとすると、リテラルエラーが発生します。

C:\PythonPractice>BinaryPacker.py 
Message to pack n unpack: 
9 
Original values: 9 
Format string : @I 
Uses   : 4 bytes 

Size of struct: 
Traceback (most recent call last): 
    File "C:\PythonPractice\BinaryPacker.py", line 43, in <module> 
    BinaryUnpacker(message) 
    File "C:\PythonPractice\BinaryPacker.py", line 33, in BinaryUnpacker 
    print 'Size of struct: ', struct.calcsize(int(input2)) 
ValueError: invalid literal for int() with base 10: '' 

C:\PythonPractice>BinaryPacker.py 
Message to pack n unpack: 
10 
Original values: 10 
Format string : @I 
Uses   : 4 bytes 


Size of struct: 
Traceback (most recent call last): 
    File "C:\PythonPractice\BinaryPacker.py", line 43, in <module> 
    BinaryUnpacker(message) 
    File "C:\PythonPractice\BinaryPacker.py", line 33, in BinaryUnpacker 
    print 'Size of struct: ', struct.calcsize(int(input2)) 
ValueError: invalid literal for int() with base 10: '' 

答えて

0

struct.calcsizeは、エンコードされたバイトオブジェクトではなく、フォーマット文字列を引数としてとります。あなたの場合は@Iになります。