5

バイナリ整数の文字列表現があり、ソケットを介して送信するには、正確なビット構造を持つバイトが必要です。

たとえば、長さ 16 の文字列がある場合0000111100001010、同じビット構造の 2 バイトが必要です。この場合、最初のバイトは の int 値を15持ち、2 番目のバイトは として持つ必要があります10asciiフォーマットで印刷できるかどうかは問題ではありません。どうすれば入手できますか?

の形式でバイトを作成する次の方法を試しました0xf0xa。ただし、これは 2 バイトではなく 6 バイトのサイズです。

def getByte(s):
  if(len(s) != 8):
    return
  b = b'0'
  for c in s:
    b = (int(b) | int(c)) & 0x0000ff #This makes b an integer
    b = b << 1
  b = b >> 1 #because of 1 extra shift
  b = hex(b).encode('utf-8') #how else can I get back to byte from int?

  return(b) 

このメソッドは長さ 8 の文字列を取り、同じ内部ビット構造のバイトを与えることを意図していますが、失敗します。(私はに似たものが必要ですstrtolC

何か助けてください。

4

2 に答える 2

9

まず、ビット文字列をリテラル値として持っている場合は、文字列リテラルではなく、基数 2 の int リテラルにします。

value = 0b0000111100001010

非リテラル ビット文字列があり、それらを整数に解析するだけでよい場合、Martineau がコメントで述べているように、必要なのは組み込みコンストラクタintだけです。baseオプションの 2 番目の引数:

value = int('0000111100001010', 2)

ビット文字列で何か凝ったことをする必要がある場合は、1 と 0 の文字列、ブール値のシーケンス、整数などとして扱うことができるオブジェクトを作成できる、bitarrayまたはのようなサードパーティ モジュールを使用することをお勧めします。 bitstring:

value = bitstring.BitArray(bin='0000111100001010')

structmartineau もコメントで説明したように、整数を取得したら、それを で 2 バイトにパックできます。

my_bytes = struct.pack('!H', value)

!「ネットワーク エンディアン」を意味します。リトル エンディアンまたはネイティブ エンディアン (またはビッグ エンディアン。もちろんネットワーク エンディアンと同じですが、コンテキストによってはより意味のある方法である可能性があります) が必要な場合は、「バイト オーダー、サイズ、および配置」を参照してください。それHを C としてパックする手段、unsigned shortつまり 2 バイト。


ただし、サードパーティのモジュールを使用している場合は、おそらくもっと単純なものがあります。たとえばbitstring.BitArray、前の例の がある場合:

my_bytes = value.tobytes()
于 2013-04-25T00:30:18.957 に答える
4

あなたが持っているようなバイナリ文字列データを変換する簡単な方法は、組み込みint()関数を使用して、数値がデフォルトの基数 10 の 10 進形式ではなく基数 2 のバイナリであることを伝えることです。

int('0000111100001010', 2)

これは整数値を返します。それをバイト文字列に変換するにpack()は、モードで関数を使用し、次のフォーマット文字列を使用しstructて、データ引数にshort(2 バイト) 符号なし整数を指定し'H'ます。

struct.pack('!H', int('0000111100001010', 2))

これをネットワークソケット経由で送信したいので、'!'プレフィックスも追加しました。これは、返されるバイトが、コンピューターのネイティブ形式ではなく、「ネットワーク」またはビッグエンディアンのバイト順であることを示します (異なる場合があります)。 .

この例で返される文字列は'\x0f\n'. 最後の'\n'は、バイト値0x0aがたまたま ASCII 改行文字であるため、Python はそれrepr()を含む文字列の を表示するときにそのように表現するためです (これは、すべての式の後に Python 対話型コンソールが自動的に行うことです)。

于 2013-04-25T01:05:34.847 に答える