Encoding.ASCII.GetBytes similar for Python ?

R

Rui

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"

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\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u00006google3com
\u0000\
u0000\u0001\u0000\u0001
Q
1
Ã
â—„






Any advice ? Thanks!
 
M

Marc 'BlackJack' Rintsch

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top