reading hex values elegantly from a datagram

D

Dave

Hi,

This is doubtless a really dumb question but is there an elegant way
of reading numbers formatted as hex from a datgram?

I get a datgram which contains values like this:

---DATAGRAM---
2aef2d43etc...
---/DATAGRAM--
where this represents 4 numbers: 2a, ef, and 2d43.

At the moment I am doing crazy things like converting it to a string,
slicing characters off (ie id = packet[0:2]), adding 0x to the front
and exec-ing the whole thing to get an integer.

I'll put my code in if you really want but it's just embarassing.

This is my first time trying to do something with sockets, so please
tell me if I have entirely missed the point. I know that you can use
read to get a number of bytes, but will that solve my problem? Can
anyone point me in the direction of a fool (ie me) proof tutorial on
using bits in python because I can't find anything. For example, is
it possible to read the binary data? At least then I am sure about
the packet structure (for a RADIUS RFC 2865 server, in the unlikely
event that anyone is interested).

TIA

Dave
 
G

George Young

This is doubtless a really dumb question but is there an elegant way
of reading numbers formatted as hex from a datgram?

I get a datgram which contains values like this:

---DATAGRAM---
2aef2d43etc...
---/DATAGRAM--
where this represents 4 numbers: 2a, ef, and 2d43.

At the moment I am doing crazy things like converting it to a string,
slicing characters off (ie id = packet[0:2]), adding 0x to the front
and exec-ing the whole thing to get an integer.

I'll put my code in if you really want but it's just embarassing.

This is my first time trying to do something with sockets, so please
tell me if I have entirely missed the point. I know that you can use
read to get a number of bytes, but will that solve my problem? Can
anyone point me in the direction of a fool (ie me) proof tutorial on
using bits in python because I can't find anything. For example, is
it possible to read the binary data? At least then I am sure about
the packet structure (for a RADIUS RFC 2865 server, in the unlikely
event that anyone is interested).

First order improvement: instead of adding 0x and exec'ing,
use the built in "int" function: int('2a', 16) ==> 42 .

Better, use the "struct" standard library module, something like:
import struct
data = mysocket.recv(MAX_UDP_LEN)
struct.unpack('BBH', data[0:4]) ==> (42, 239, 17197)

Of course you must look carefully at byte order, signed/unsigned,
etc. Do:
import struct
help(struct)
for details.
 
P

Paul Rubin

At the moment I am doing crazy things like converting it to a string,
slicing characters off (ie id = packet[0:2]), adding 0x to the front
and exec-ing the whole thing to get an integer.

Don't ever exec data from an untrusted source. Use int(packet[0:2], 16).
 

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,744
Messages
2,569,479
Members
44,900
Latest member
Nell636132

Latest Threads

Top