2017-05-02 13 views
0

私はPyserialを使用してバイトを接続に書き出します。私は私が望む正確にビットを書き出す方法を考え出すさで苦労されているもののバイトを書き込む

一つ。私は、このような

variable = 'h'.encode() 
serial.write(variable) 

として、文字列のASCII形式のバイトを書き出す成功を収めているそして、それは正常にHのビットを書き込みます。 しかし、もし私がb '\ b001'のようなことをすれば、私はそれが望むように001を書き出しません。

書き込み機能をので、私は単純に1と0を使用して変数を定義することができ、これを行うと、次に使用する方法はあります。

私はこのような定義も試してみました:

y = 0x13 
out = s.write(y) 

書き込み機能のマニュアルによると、関数は書き込まれたバイトの量を返します。私は、この特定のコードを実行したとき、それは私が正しく理解していれば、あなたが(第二部)でのpythonバイトのオブジェクトとしてPythonバイトのオブジェクト、および進データとしてバイナリデータを送信する方法を見つけようとしている19

+0

あなたがしようとしていることは明確ではありません。あなたが入力したいものとそれから生成されることを期待するものを表示できますか? –

答えて

1

を返しました。

これは直観的ではないかもしれませんが、ピューターb''の構文はbinary, but bytesの略語なので、なぜb'0010101'が好きなように動作しません。

バイトはデフォルトで16進データをバイトとして受け入れます。これを行うには、16進データをb'\xFF\x04'としてフォーマットする必要があります。例えば、

byte_obj = bytes(b'\xFF\x04') 

これは、pyserialを介して送信することができます。バイナリを行うには、python intの構築方法、つまりint(number, base)メソッドを使用する必要があります。

は、これはさらにhere

を説明したが、これは基本的にサイズのみ8ビットのバイナリ文字列のために働くことを残念ながら

bin_to_int int('01010101', 2) 
byte_obj = bytes([bin_to_int]) #requires array of ints 

を介して行うことができます(そして、それはそうあなたに言って、あなたにエラーが発生します) 。これを回避するためには、次の操作を実行できます

bin_to_int int('0101010101010101', 2) 
# to_bytes takes size in bytes and endianess, which is the order the bytes are placed. 
byte_obj = bin_to_int.to_bytes(2, 'little') 

リトルエンディアンであるleast significant byte in smallest address(つまり、インデックス0)大きいが

が大きく進整数の方法のように注意してください反対ですが、私はわからないんだけどPythonが内部的にバイナリを整数に変換するのは何ですか?しかし、任意の大きなバイナリデータに対して、私は変換をどうやって実装するのかによって遅くなると思います。

bit_string = "101010101..." 
exponent = 0 
decimal_value = 0 
for bit in bit_string: 
    decimal_value += int(bit)**exponent 
    exponent += 1 

それは最初は非常に明白ではないかもしれませんが、Pythonのint型がarbitrailyサイズであるため、最終的にはあなたが得ようとしている:私はあなたに私は符号なし整数への変換バイナリを行うだろうかに理由の例をあげます通常の算術intサイズ(すなわち64ビットより大きい)の外で、非常に大きなintを一緒に追加するところまでです。これは、大規模なバイナリ値(あなたが生成する可能性が高い)の時間が経つにつれて、Nが加算のバイト単位でサイズを増やし、64ビット外で増加すると非線形時間の複雑さを得ることになることを意味します

これを解決するには、バイナリ値をバイトで変換する前にバイナリ値を区切る関数を作成するだけで済みます(これはO(1)の代わりにO(n_bytes)になります)。 (binary_to_bytes(binary_string)のような)

関連する問題