2016-08-09 7 views
0

私は様々なバイトをASCII表現の形でシリアルで書いています。シリアルPython3のバイナリ表現

相続人の例:この関数

def convert_addr_with_flag(addr, flag): 
    if(addr[0:1]!="0x"): 
     # String does not have hex start, for representation 
     addr = "0x" + addr 
    # Convert String to int 
    return binascii.unhexlify(str(hex(int(addr, 16) + (flag << 31))[2:].zfill(8))) # Return the int value, bit shiffted with flag 

bytes_to_write = '\aa' # Will write 01010101

は、今、私が送信するものの一部を転送する必要がある4つのバイトを計算する私を必要とする、私は以下の機能を使用してバイトを計算しますしかし、ASCII文字列の代わりにバイナリ文字列を返します。ここに例があります... convert_addr_with_flag("00ACFF21", 1) # Output: b'\x80\xac\xff!'

私の質問は、この出力をパケットの他のバイトに追加できる形式にする方法です。例えば..私はすでにdecode("UTF-8)とUTF-16およびASCIIを使用して、 を試してみました相続人は何

part_1 = '\xaa\xaa' # 2 bytes 
part_2 = '\x55\x55' # 2 bytes 
part_3 = convert_addr_with_flag("00ACFF21", 1) # 4 bytes 
full_packet = part_1 + part_2 + part_3 # Will not work, as part_3 is a binary string (b'\x80\xac\xff!) 

。バイト列は理解できません。 スライシング。 [2]は私にバイナリ文字を与えますが、 '2番目のバイト'は返しません

ヒントは非常に高く評価されるでしょう! part_3のないASCII表現がないため

のPython 3.4

+0

あなたはピクルモジュールを考えましたか?これは、ワイヤ(ファイル、ソケット)を介してデータを送信することができ、同様にあなたのためのデータを再構築します。 – rts1

+0

残念ながら、正確なバイナリをワイヤで送信する必要があります。面白いモジュールですが、将来的には手軽に利用できます – Harvey

答えて

0

decodeが機能していません。 ASCII文字は0から127までの整数でなければなりません。この例のpart_3b'\x80\xac\xff!'です。最初の3バイトは128,172、および255であり、いずれも有効なasciiではありません。

0から127以外のバイトを送信する必要がある場合は、おそらくpart_1part_2がバイト文字列である必要があります。

+0

パケットのすべての部分をバイトオブジェクトとして作成する方法を取ってきました。私は、pyserialがエンコードされた文字列の代わりに生のバイトを書くことができる限り、これはうまくいくと思います – Harvey

関連する問題