2017-07-07 11 views
-1

私のPythonアプリケーションは、C++アプリケーションから16ビットの整数タプルの配列を受け取る必要があります。Pythonでソケットから16ビットの整数タプルの配列を受け取る方法は?

データは32ビットの符号なし整数の配列で構成されます。各整数はIQ複素数を表します。 IとQはそれぞれ符号付き16ビット数です。

アレイサイズは一定(6000)です。

アプリは同様のアーキテクチャで動作するので、エンディアンを心配する必要はありません。

ソケットからIQタプルのリストにデータを読み込むためのPythonコードスニペットを提案してください。 (私はソケットを作成して接続する方法を知っています)。

敬具

デビッド

答えて

0

バイナリデータを処理するオプションがいくつかあります。この場合、ソケットから読み込み、不変のバイトバッファ(Python 3ではbytes、Python 2ではstr)を生成します。これはstruct.unpackまたはarray.arrayのいずれかを使用して16ビット・ワードとして解析することができます。

tuple_of_ints = struct.unpack('=12000h', data) 
array_of_s16s = array.array('h', data) 

そこから、あなたはまだ奇数と偶数のアイテムは、あなたのIおよびQ値であり、唯一の1次元構造を、持っています。 numpyを使用している場合、ndarray.fromstringまたはndarray.frombufferを使用して同様の配列を作成し、それを再形成することができます。

我々はまた少し遅いれ、個別の項目を変換することができます。ファイルのようなソケットにあなたがnumpy.fromfile(socket, numpy.int16, 2*6000)を使用することができるかもしれないので

list_of_complex_numbers = [complex(*struct.unpack('hh',data[i:i+4])) 
    for i in range(0,len(data),4)] 

numpyのは、また、ファイルから読み取ることができます。

+0

ありがとうございました。それはとても役に立ちます。 – DavidA

+0

fmt: '= 12000h'について説明してください。 – DavidA

+0

'struct'のドキュメントへのリンクをたどると、' = 'はネイティブバイトオーダー、' 12000'はアイテム数、 'h'(ニーモニック:ハーフワード)は16ビット符号付き整数'hh'も同様に' 2h'と書くことができます。 –

2

あなたはpythonで構造体ライブラリを使用することができます16進バイトとして入ってくるデータを持っています。

単純な16進数の場合、変換は直接的です。

C++から受け取ったデータ型とPythonで必要な形式を伝えることができれば、本当に役に立ちます。

+0

この配列は、16ビットの2の補数の整数のパックド配列です。それぞれの連続した16ビット整数のペアは、整数のPythonタプル(理想的には、ビット操作を行う必要がある場合は16ビットも)に割り当てる必要があります。 – DavidA

+0

構造体は16進表記とは関係ありません。バイナリデータを処理します。 –

+0

整数のサイズを16ビットに制限するには、Pythonでctypesを使用できます。変数のアンパックと変換はstructライブラリによって可能です。 –

関連する問題