Encoding.ASCII.GetBytes similar for Python ?
Hi, how can i do what Encoding.ASCII.GetBytes (in .net, c#) does with the strings. I am trying to query some dns server to check its response using udp sockets. Some of the source below: # encoding: utf8 import socket import sys import struct IP_PORT = 53 server_host = ('4.2.2.1', IP_PORT) transaction_id = Q1 TIMEOUT = 5 type_string = \u0001\u\u\u0001\u\u\u\u\u\u trailer_string = \u\u\u0001\u\u0001 address = 'google.com' url_name_start, domain_name = address.split(.) # Query format copied from the C# example. #QueryString = TransactionID1 + TypeString + (char)URLNameStart.Length + URLNameStart + (char)DomainName.Length + DomainName+ TrailerString; query = (transaction_id + type_string + str(len(url_name_start)) + url_name_start + str(len(domain_name)) + domain_name + trailer_string) print query sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(TIMEOUT) sock.connect(server_host) sock.send(query) data = sock.recv(512) for data_item in data: try: print chr(data_item) except: print data_item But it just returns trash: python dns_checker.py Q1\u0001\u\u\u0001\u\u\u\u\u\u6google3com \u\ u\u0001\u\u0001 Q 1 Ï ◄ Any advice ? Thanks! -- http://mail.python.org/mailman/listinfo/python-list
Re: Encoding.ASCII.GetBytes similar for Python ?
Hi, Rui wrote: Hi, how can i do what Encoding.ASCII.GetBytes (in .net, c#) does with the strings. I am trying to query some dns server to check its What would it do? response using udp sockets. Some of the source below: # encoding: utf8 import socket import sys import struct IP_PORT = 53 server_host = ('4.2.2.1', IP_PORT) transaction_id = Q1 TIMEOUT = 5 type_string = \u0001\u\u\u0001\u\u\u\u\u\u trailer_string = \u\u\u0001\u\u0001 address = 'google.com' url_name_start, domain_name = address.split(.) # Query format copied from the C# example. #QueryString = TransactionID1 + TypeString + (char)URLNameStart.Length + URLNameStart + (char)DomainName.Length + DomainName+ TrailerString; query = (transaction_id + type_string + str(len(url_name_start)) + url_name_start + str(len(domain_name)) + domain_name + trailer_string) print query You should refrain from trying a 1:1 translation from one language to another. This makes funny things with natural languages as well as it is horribly with computer languages. You should really read on string formatting in python. Also, while indeed usefull to understand whats going on for production use this is not recommended anymore, since you would have to randomize ports for requests instead of using fixed 53UDP. I'd recommend having a look on python adns - http://code.google.com/p/adns-python/ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(TIMEOUT) sock.connect(server_host) sock.send(query) data = sock.recv(512) for data_item in data: try: print chr(data_item) this is never going to work since recv() returns a string buffer, not a list of integers. HTH Tino smime.p7s Description: S/MIME Cryptographic Signature -- http://mail.python.org/mailman/listinfo/python-list
Re: Encoding.ASCII.GetBytes similar for Python ?
On Mon, 22 Sep 2008 04:23:09 -0700, Rui wrote: Hi, how can i do what Encoding.ASCII.GetBytes (in .net, c#) does with the strings. I am trying to query some dns server to check its response using udp sockets. Some of the source below: # encoding: utf8 import socket import sys import struct IP_PORT = 53 server_host = ('4.2.2.1', IP_PORT) transaction_id = Q1 TIMEOUT = 5 type_string = \u0001\u\u\u0001\u\u\u\u\u\u trailer_string = \u\u\u0001\u\u0001 Are you sure you want normal byte strings with *that* content!? In [90]: s = \u\u\u0001\u\u0001 In [91]: len(s) Out[91]: 30 In [92]: print s \u\u\u0001\u\u0001 This is not 5 unicode characters but 30 ASCII characters. But why using unicode anyway? I guess the DNS server expects bytes and not unicode characters. address = 'google.com' url_name_start, domain_name = address.split(.) # Query format copied from the C# example. #QueryString = TransactionID1 + TypeString + (char)URLNameStart.Length + URLNameStart + (char)DomainName.Length + DomainName+ TrailerString; query = (transaction_id + type_string + str(len(url_name_start)) + url_name_start + str(len(domain_name)) + domain_name + trailer_string) print query sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(TIMEOUT) sock.connect(server_host) sock.send(query) data = sock.recv(512) for data_item in data: try: print chr(data_item) except: print data_item This will always end up in the ``except`` branch because `data` is a string and `chr()` expects integers. Any chance you wanted `ord()` instead? When you print out trash please use `repr()` so we can see what trash *exactly* you get. Ciao, Marc 'BlackJack' Rintsch -- http://mail.python.org/mailman/listinfo/python-list