2016-08-16 16 views
0

私は異なる長さのデータグラムを受け取ったudpソケットを持っています。 データグラムの最初のものは、受信しようとしているデータのタイプを指定します。たとえば、64はbool false、65はbool true、66はsint、67はintを意味します。ほとんどのデータ型は長さがわかっていますが、文字列とwstringについては、最初のバイトは85文字を意味し、次の2バイトは文字列の長さに続いて実際の文字列を示します。 wstring 85の場合、次の2バイトはwstringの長さを示し、その後に実際のwstringが続きます。 文字列をwstringにPython

は、私は次のコード

data = str(rawdata[3:]).split("\\x00") 
data = "".join(data[1:]) 
data = "".join(data[:-1]) 

これが正しいか、他の簡単な方法ですが使用するフォーマットb'U\x00\x07\x00C\x00o\x00u\x00p\x00o\x00n\x001'をwstringの上記の種類をオフに解析するには?

データグラムを受け取ったので、データグラムも送信する必要があります。しかし、socket.sendtoにはbytesが必要なので、データグラムの作成方法はわかりません。文字列をutf-16形式に変換しようとすると、wstringに変換されます。ので、どのように私はwstringのされて上記データグラム情報U -85からbytes

に残りの情報を追加したい場合は、\x00\x07 - wstringのデータの7長、\x00C\x00o\x00u\x00p\x00o\x00n\x001は - 実際の文字列Coupon1

答えて

1

Aです完全な答えは、結果のデータで何をするつもりかによって異なります。 '\x00'で文字列を分割すること(あなたが意図したことを前提としていますか?そこに2つのバックスラッシュがある理由を理解できていないかどうかはわかりません)。最初にwstringタイプを使用する理由は、普通の古い8ビット(実際には7ビット)ASCIIではない文字を表現できるようにするためです。あなたが標準のローマ字でない文字を持っている場合、0バイト以外の文字を分離している可能性があります。この場合、splitの結果は意味をなさないでしょう。

警告:バイトが必要なsendtoと書いてあるので、私はあなたがpython3を使用していると仮定します。詳細はpython2で若干異なります。

あなたが何を意味するのか分かっていれば、「utf-16-be」コーデックがあなたが探しているものかもしれません。 ( "utf-16"コーデックではエンコードされた文字列の先頭に「バイトオーダーマーカー」が置かれますが、「utf-16-be」はビッグエンディアンの16ビット文字をバイトに置きます文字列)のデコードは、このような何かを行うことができます。これはPythonのUnicode文字列としてdstringを残すだろう

rawdata = b'U\x00\x07\x00C\x00o\x00u\x00p\x00o\x00n\x001' 

dtype = rawdata[0] 
if dtype == 85:  # wstring 
    dlen = ord(rawdata[1:3].decode('utf-16-be')) 
    data = rawdata[3: (dlen * 2) + 3] 
    dstring = data.decode('utf-16-be') 

を。 Python3では、すべての文字列はUnicodeです。だからあなたは終わった。それをコードする

はこのような何かを行うことができます。

tosend = 'Coupon1' 
snd_data = bytearray([85]) # wstring indicator 
snd_data += bytearray([(len(tosend) >> 8), (len(tosend) & 0xff)]) 
snd_data += tosend.encode('utf-16-be') 
関連する問題