2011-01-18 17 views
7

32バイト(他の長さが必要かもしれませんが)整数をPythonのバイトオブジェクトに変換したいと思います。これを行うきれいで簡単な方法はありますか?私はあなたを推測しているnバイトのintをpython3のバイトに変換する

+0

あなたの整数は現在どのような形式ですか? –

+5

32バイト整数?それは多くのニュー...バイトです。あなたは何を正確に達成しようとしていますか、何を試しましたか? –

+0

私は0x形式でshaハッシュを持っていますが、pythonは完全に整数に変換するのは幸せですが、そこからバイトを得るにはどうしたらいいですか? – Peter

答えて

3

は、ブートに32ビット整数、およびビッグエンディアンが必要になります。

>>> from ctypes import c_uint32 
>>> l = c_uint32(0x12345678) 
>>> bytes(l) 
b'xV4\x12' 

同様c_uint8、c_uint16とc_uint64があります。より長い整数の場合は、divmod(x、256)を使用して手動で行う必要があります。

>>> def bytify(v): 
... v, r = divmod(v, 256) 
... yield r 
... if v == 0: 
...  raise StopIteration 
... for r in bytify(v): 
...  yield r 
... 
>>> [x for x in bytify(0x12345678)] 
[120, 86, 52, 18] 
>>> bytes(bytify(0x12345678)) 
b'xV4\x12 
>>> bytes(bytify(0x1234567890987654321)) 
b'!Ce\x87\t\x89gE#\x01!Ce\x87\t\x89gE#\x01' 
+0

ctypesを使用する必要はありません。 'bytes'は、範囲(0,256)の' int'の配列で初期化できます。 – Tom

+0

@トム:あなたは明らかに答え全体を読まなかった。 –

+0

@Lennart様、あなたはctypesをインポートすることであなたの答えを始めました。さまざまなサイズのctypeを表示するようになりました。そして、それを使用しないソリューション(私が個人的には最初のソリューションであったはずだと思います)を提供しました。私はちょうどその事実を明示的に言及することが重要であると考えました、それだけです。あなたは意見に同意する権利があります。あなたがそれに合っていると思わない場合、答えを言い換える必要はありませんが、告発する必要はありません。私は何人かの人々がctypesが必要であり、それによって落胆する間違った印象を得るかもしれないと思うので私が言ったことを言った。 – Tom

7

to_bytesは(長さ、BYTEORDER [署名])あなたが3.2から始まる必要があるすべてです。この場合、someidentifier .to_bytes(4、 'big')は、必要なバイト文字列を与える必要があります。

+0

>>> hash.to_bytes(32) ...トレースバック(最新の呼び出しの最後): で ...ファイル ""、ライン1、... hash.to_bytes(32) ... AttributeError: 'builtin_function_or_method'オブジェクトに属性がありません 'to_bytes' – Tom

+0

次回は別の識別子を使用します。 'ハッシュ'は、組み込み変数ではなく、実際の変数名またはリテラルを意味していました。私はそのような組み込みがあったことを忘れていました。 byteorderも今必要です。 – SilverbackNet

+0

ああ、私は混乱していた - 今それはすべての明確な、ありがとう! – Tom

2

bytes("iterable")を直接ご利用いただけます。 iterableの各値はbyteの中でbytes()になります。リトルエンディアンエンコーディングの例:

>>> var=0x12345678 
>>> var_tuple=((var)&0xff, (var>>8)&0xff, (var>>16)&0xff, (var>>24)&0xff) 
>>> bytes(var_tuple) 
b'xV4\x12' 
1

はあなたが我々がそれからバイナリを取得したい

var = 'і' # var is ukrainian і 

があるとします。 フローです。文字列=>値は、/ => int型=>バイナリ

binary_var = '{:b}'.format(int.from_bytes(var.encode('utf-8'), byteorder='big')) 

今binary_varは '1101000110010110' でバイト。それは文字列です。

今、あなたはバイナリからUnicode値を取得したい、戻っ:

int_var = int(binary_var, 2) # here we get int value, int_var = 53654 

今はバイトの整数に変換する必要があります。ウクライナの「іは」1バイトになっちゃうフィット感ではなく、2に我々はB「\ XD1 \ X96」

bytes_var = int_var.to_bytes(2, byteorder='big') 

最後に、我々は我々のバイトをデコードする= bytes_var実際のバイトに変換します。

関連する問題