2010-12-24 10 views
26

Python 2.xは0-255の範囲の数値をその数値の1文字を含むバイト文字列に変換するchr()と数値を変換するunichr() 0〜0x10FFFFの範囲で、そのUnicodeコードポイントで1文字のUnicode文字列に変換されます。 chr()が行ったことを正確に行うことはできません。Python 3.xは、unichr()chr()に置き換え、「Unicode文字列はデフォルトです」というポリシーに従います。 (2.6)2to3ユーティリティは、一般的に適切ではない単独chrコール、:(py3k内のbytesオブジェクトを返すchr()相当

(これは、明示的に8ビット・バイトで定義されているファイルフォーマットを解析し、シリアライズするためのものである。)

答えて

8

()、(255)をByteArrayの使用を検討Pyの中に同じ動作します。たとえば

b = bytes([x]) 

thon2とPython3。どちらのPython世代でも、結果のbytearrayオブジェクトは、Python2のstr()とPython3の実バイト()の別名であるバイト(obj)に変換できます。

# Python2 
>>> x = bytearray((32,33)) 
>>> x 
bytearray(b' !') 
>>> bytes(x) 
' !' 

# Python3 
>>> x = bytearray((32,33)) 
>>> x 
bytearray(b' !') 
>>> bytes(x) 
b' !' 
26
を残し

試してみてください次:

>>> bytes([255]) 
b'\xff' 
+0

を使用し、Pythonの2/3互換のコードを書きたい場合。それはとにかく、仕事をします。 – zwol

+2

@Zack: '' bytes((255、)) ''をバリエーションとして使うことができます。 Python2の – malthe

+6

バイト((255))は、b '\ xff'を返しません...代わりに '(255、)'を返します。 –

5
>>> import struct 
>>> struct.pack('B', 10) 
b'\n' 
>>> import functools 
>>> bchr = functools.partial(struct.pack, 'B') 
>>> bchr(10) 
b'\n' 
4

私はスクラッチアレイの周りに投げるが、おそらく私がいけないについて少し落ち着きを得るsix.int2byte

+0

グイドの答えよりも優れている理由は分かりません。 – zwol

+0

@zwol:Python 3.2以降では、 'int2byte = operator.methodcaller(" to_bytes "、1、" big ")'です。コメントによると、これは 'バイト((...))より約2倍高速です。とにかく、 'int2byte(x)'は私のために 'bytes(bytearray((x、)))より良く見えます。 – zhangyoufu

+0

スピードは良いですが、元の質問を引き起こした事柄では、*標準ライブラリの外の依存関係は重視されませんでした。 – zwol

関連する問題