L'envoi de Valeurs hexadécimales à travers le protocole TCP ou UDP socket via le passage de paramètres à un script
Je sais que pour envoyer des données à travers un socket UDP utilisation de python doit être dans le format suivant "\x41" = Un .
J'ai un script python udp_send.py et je veux envoyer dans un hex pour représenter la valeur d'une valeur de registre sur le serveur.
J'exécute mon script via linux terminal >>python udp_send.py "\x41" . J'ai lu la variable à l'aide de argv[1] dans mon script python. J'ai fait un len vérifier et il est de 3 . Il ignore \ et prendre x, 4 et 1 que 1 octet chacun alors que je veux \x41 pour représenter 1 octet.
J'ai ensuite essayer de concaténer des données="\x"+"41", mais cela n'a pas fonctionné.
"\x" est interprété comme s'échapper par python. Je suis en train d'essayer de trouver un moyen de passer d'une valeur hexadécimale dans mon script et de l'envoyer via socket UDP?
J'ai obtenu jusqu'à présent. Envoyer un hex de la valeur définie dans le script python via socket UDP .
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()
J'ai utilisé wireshark sur le côté serveur et vu la valeur hex 41 apparaissent.
Juste pour être clair, "41"(2 octets) n'est pas le même que le "\x41"(un octet seulement) en python.
Ma simple question est, comment puis-je prendre un caractère "41" et de le joindre avec "\x" pour la forme "\x41" afin que je puisse l'affecter à la variable de données dans mon script python, donc je peux l'envoyer en tant que valeur hex 41.
OriginalL'auteur Abdulhak N. | 2012-04-11
Vous devez vous connecter pour publier un commentaire.
Dans votre code, vous pouvez convertir vos arg au bon format, vous pouvez l'appeler avec
python udp_send.py 0x41
Au lieu de struct.pack, vous pouvez également utiliser
chr(intarg)
.OriginalL'auteur TJD
Vous faites votre problème plus compliqué que vous en avez besoin. Caractères contiennent déjà leurs valeurs d'octets. Vous devriez être en mesure de simplement passer la chaîne "A", et tout ira bien.
Tout d'abord, il n'y a pas de différence entre '\x41 " et " A " en python. Les deux représentent une chaîne de caractères composée de l'octet
0x41
. (ou binaire0100 0001
. N'importe quel lieu (en python) que vous pouvez utiliser, vous pouvez utiliser les autres. Le problème, c'est parce que de la façon dont le shell traite votre chaîne avant de passer à python. Le shell voit la barre oblique inverse, tente d'échapper le caractère suivant, et échoue (car \x n'est pas un shell valide échapper), passex
à travers sans échappement, puis transmet les caractères4
et1
. Donc, python reçoit un trois caractères chaîne de caractèresx
4
et1
. Si vous souhaitez passer la barre oblique inverse, vous avez besoin de s'en échapper, mais qui ne sera pas obtenir ce que vous voulez. Ensuite python obtiendrez un à quatre octets chaîne composée des caractères\
,x
,4
, et1
. Ses repr sera'\\x4a'
, et si vous l'imprimez, il ressemble à\x4a
.Afin d'obtenir la valeur d'un octet
0x41
, utiliser le caractèreA
.Ah, oui. Puis faire ce que l'autre réponse dit. 🙂
OriginalL'auteur jcdyer