2012-04-11 97 views
3

我知道为了通过UDP套接字使用python发送数据必须采用以下格式“\ x41”= A。通过UDP或TCP套接字通过参数传递给脚本发送十六进制值

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

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

我当时试图连接数据=“\ x”+“41”,但它没有工作。

“\ x”被解释为由python转义。我试图找到一种方法将十六进制值传入我的脚本并通过UDP套接字发送它?

我已经实现了以下目标。通过UDP套接字发送在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.

回答

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) 
+0

非常感谢。正是我在找什么。我知道存在一种包装方法,只是不知道如何使用它。再一次感谢你。 – 2012-04-11 21:57:35

+0

除了struct.pack,你还可以使用'chr(intarg)'。 – jcdyer 2012-04-17 14:41:13

1

您正在使您的问题比您需要的更加复杂。字符已包含其字节值。你应该能够传递字符串'A',并且一切都会正常工作。

首先,Python中'\ x41'和'A'没有区别。两者都代表由字节0x41组成的一个字符串。 (或二进制0100 0001。任何你可以使用的地方(在python中),你可以使用另一个。问题在于shell是如何在将它传递给python之前解析你的字符串的,shell会看到反斜杠,尝试为逃避下一个字符,失败(因为\ x不是一个有效的shell转义),通过通过非转义,然后传递字符41所以python接收由字符 41组成的三个字符的字符串。如果你想通过反斜杠,你需要转义它,但不会达到你想要的效果,然后python会得到一个由字符\,x,41组成的四字节字符串。 '\\x4a',如果你打印它,它w看起来像\x4a

为了得到一个字节的值0x41,使用字符A

+0

感谢jcdyer以上答案调用它。不过,我想发送不同的十六进制值在服务器端的不同的寄存器地址。如果我想发送“\ xAA”或“x01”或“\ x0F”,它们不能像字符'A'那样用字符“\ x41”完全定义。所以我想发送十六进制值给python并通过udp端口发送出去。 – 2012-04-11 21:35:53

+0

啊,是的。然后做另一个答案。 :) – jcdyer 2012-04-17 14:39:51

相关问题