3

Pythonを使用してUDPソケットを介してデータを送信するには、次の形式である必要があることを知っています "\ x41"=A。

Pythonスクリプトudp_send.pyがあり、サーバー側のレジスタ値を表す16進値を送信したいと思います。

Linuxターミナル>>pythonudp_send.py"\x41"を介してスクリプトを実行します。Pythonスクリプトでargv[1]を使用して変数を読み取りました。lenチェックをしましたが3です。\を無視し、x、4、1をそれぞれ1バイトとしますが、\x41は1バイトのみを表します。

次に、data = "\ x" + "41"を連結しようとしましたが、機能しませんでした。

「\x」はPythonによるエスケープとして解釈されます。16進値をスクリプトに渡してUDPソケット経由で送信する方法を見つけようとしていますか?

これまでに次のことを達成しました。UDPソケットを介してPythonスクリプトで定義された16進値を送信します。

from socket import *
from sys import *

## Set the socket parameters
host = <ip-define-here>
port = <port-define-here>
buf = 1024
addr = (host,port)

## Create socket
UDPSock = socket(AF_INET,SOCK_DGRAM)

## Send messages
data ='\x41'
#data=argv[1] #commented out
if not data:
    print "No data"
else:
    if(UDPSock.sendto(data,addr)):
        print "Sending message ",data

## Close socket
UDPSock.close()

サーバー側でwiresharkを使用したところ、16進値41が表示されました。

明確にするために、「41」(2バイトで構成)は、Pythonの「\ x41」(1バイトのみ)と同じではありません。

私の簡単な質問は、文字「41」を取得し、それを「\ x」と結合して「\x41」を形成し、Pythonスクリプトのデータ変数に割り当てて16進値41として送信できるようにする方法です。

4

2 に答える 2

3

コードでは、argを適切な形式に変換してから、次のコマンドで呼び出すことができます。python udp_send.py 0x41

arg = sys.argv[1]

# intarg = 65 == 0x41
intarg = int(arg, 16)

# now convert to byte string '\x41'
hexstring = struct.pack('B', intarg)
于 2012-04-11T21:09:23.603 に答える
1

あなたはあなたの問題をあなたが必要とするよりももっと複雑にしている。文字にはすでにバイト値が含まれています。文字列「A」を渡すだけで、すべてが正常に機能するはずです。

まず第一に、Pythonでは「\x41」と「A」の間に違いはありません。どちらも、バイトで構成される1文字の文字列を表します0x41。(またはバイナリ0100 0001。一方を使用できる場所(Pythonの場合)、もう一方を使用できます。問題は、文字列をPythonに渡す前に、シェルが文字列を解析する方法が原因で発生します。シェルはバックスラッシュを認識し、次の文字をエスケープし、失敗し(\ xは有効なシェルエスケープではないため)、xエスケープせずに通過し、文字4とを渡し1ます。したがって、Pythonは文字とで構成される3文字の文字列を受け取りx 4ます1。バックスラッシュを渡したい場合を介して、それをエスケープする必要がありますが、それはあなたが望むものを達成しません。そうすると、Pythonは文字で構成される4バイトの文字列を取得します\、、、、および。x_ そのreprはになり、印刷するとのようになります。 41'\\x4a'\x4a

1バイトの値を取得するに0x41は、文字を使用しますA

于 2012-04-11T21:01:11.263 に答える