reading hex values elegantly from a datagram

George Young gry at ll.mit.edu
Tue Aug 26 09:29:40 EDT 2003


On Tue, 26 Aug 2003 05:29:46 -0700, Dave wrote:

> 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.





More information about the Python-list mailing list