3

我知道为了使用 python 通过 UDP 套接字发送数据,必须采用以下格式 "\x41" = A 。

我有一个 python 脚本 udp_send.py,我想发送一个十六进制值来表示服务器端的寄存器值。

我通过 linux 终端 >>python udp_send.py "\x41" 运行我的脚本。我在 python 脚本中使用 argv[1] 读取了变量。我做了一个 len 检查,它是 3 。它忽略 \ 并将 x、4 和 1 分别作为 1 个字节,而我希望 \x41 仅代表 1 个字节。

然后我试图连接 data="\x"+"41" 但它没有用。

"\x" 被 python 解释为转义。我正在尝试找到一种将十六进制值传递到我的脚本并通过 UDP 套接字发送它的方法?

到目前为止,我已经实现了以下目标。通过 UDP socket 发送在 python 脚本中定义的十六进制值。

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,看到了十六进制值41。

只是要清楚“41”(由 2 个字节组成)与 python 中的“\x41”(仅一个字节)不同。

我的简单问题是,如何获取一个字符“41”并将其与“\x”连接以形成“\x41”,以便我可以将它分配给我的 python 脚本中的数据变量,以便我可以将它作为十六进制值 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'没有区别。两者都表示由 byte 组成的一个字符串0x41。(或二进制0100 0001。任何地方(在 python 中)你可以使用一个,你可以使用另一个。问题来了,因为 shell 在将它传递给 python 之前如何解析你的字符串。shell 看到反斜杠,试图转义下一个字符,失败(因为 \x 不是有效的 shell 转义),x通过未转义,然后通过字符4和。所以 python 接收由字符和1组成的三个字符串。如果你想通过反斜杠通过,你需要转义它,但这不会达到你想要的.然后python将得到一个由字符组成的四字节字符串x 41\, x,41. 它的 repr 将是'\\x4a',如果您打印它,它将看起来像\x4a.

为了获得单字节值0x41,请使用字符A

于 2012-04-11T21:01:11.263 回答