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