【问题标题】:Sending Hex Values through UDP or TCP socket via parameter passing to script通过 UDP 或 TCP 套接字通过传递给脚本的参数发送十六进制值
【发布时间】:2012-04-11 20:35:09
【问题描述】:

我知道为了使用 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 套接字发送在 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。

【问题讨论】:

    标签: python sockets hex parameter-passing


    【解决方案1】:

    在您的代码中,您可以将您的 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)
    

    【讨论】:

    • 非常感谢。正是我想要的。我知道存在一个打包方法,只是不知道如何使用它。再次感谢您。
    • 代替struct.pack,你也可以使用chr(intarg)
    【解决方案2】:

    你让你的问题比你需要的更复杂。字符已经包含它们的字节值。你应该可以只传递字符串'A',一切都会正常。

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

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

    【讨论】:

    • 感谢 jcdyer 的上述回答。但是我想在服务器端为不同的寄存器地址发送不同的十六进制值。如果我想发送“\xAA”或“x01”或“\x0F”,它们不能完全由字符定义,就像“\x41”可以用字符“A”一样。所以我想将十六进制值发送到 python 并通过 udp 端口​​发送出去。
    • 啊,是的。然后按照另一个答案所说的去做。 :)
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2014-05-15
    相关资源
    最近更新 更多