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\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000" > trailer_string = "\u0000\u0000\u0001\u0000\u0001"
Are you sure you want normal byte strings with *that* content!? In [90]: s = "\u0000\u0000\u0001\u0000\u0001" In [91]: len(s) Out[91]: 30 In [92]: print s \u0000\u0000\u0001\u0000\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