Encoding.ASCII.GetBytes similar for Python ?

Marc 'BlackJack' Rintsch bj_666 at gmx.net
Mon Sep 22 09:08:06 EDT 2008


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



More information about the Python-list mailing list