Reading hex to int from a binary string

Luc luc.traonmilin at gmail.com
Fri Oct 9 03:20:18 EDT 2009


On Oct 9, 3:12 am, Dennis Lee Bieber <wlfr... at ix.netcom.com> wrote:
> On Thu, 8 Oct 2009 14:52:33 -0700 (PDT), Luc <luc.traonmi... at gmail.com>
> declaimed the following in gmane.comp.python.general:
>
>
>
> > On Oct 8, 11:13 pm, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
> > > Luc schrieb:
>
> > > > Hi all,
>
> > > > I read data from a binary stream, so I get hex values as characters
> > > > (in a string) with escaped x, like "\x05\x88", instead of 0x05.
>
> > > > I am looking for a clean way to add these two values and turn them
> > > > into an integer, knowing that calling int() with base 16 throws an
> > > > invalid literal exception.
>
> > > > Any help appreciated, thanks.
>
> > > Consider this (in the python interpreter):
>
> > >  >>> chr(255)
> > > '\xff'
> > >  >>> chr(255) == r"\xff"
> > > False
> > >  >>> int(r"ff", 16)
> > > 255
>
> > > In other words: no, you *don't* get hex values. You get bytes from the
> > > stream "as is", with python resorting to printing these out (in the
> > > interpreter!!!) as "\xXX". Python does that so that binary data will
> > > always have a "pretty" output when being inspected on the REPL.
>
> > > But they are bytes, and to convert them to an integer, you call "ord" on
> > > them.
>
> > > So assuming your string is read bytewise into two variables a & b, this
> > > is your desired code:
>
> > >  >>> a = "\xff"
> > >  >>> b = "\xa0"
> > >  >>> ord(a) + ord(b)
> > > 415
>
> > > HTH, Diez
>
> > Sorry I was not clear enough. When I said "add", I meant concatenate
> > because I want to read 0x0588 as one value and ord() does not allow
> > that.
>
> > However you pointed me in the right direction and I found that int
> > (binascii.hexlify(a + b, 16)) does the job.
>
>         Yeesh... This is what   struct  is designed for...
>
> >>> import struct
> >>> something = "\x05\x88and more\r\n"
> >>> print something
>
>  ˆand more
>
>
>
> >>> (h1, st, h2) = struct.unpack("H8sh", something)
> >>> h1
> 34821
> >>> st
> 'and more'
> >>> h2
> 2573
>
> >>> print "%4x, %4x" % (h1, h2)
>
> 8805,  a0d
>
>         You may need to adjust for expected endian mode...
>
> >>> (h1, st, h2) = struct.unpack(">H8sh", something)
> >>> print "%4.4x, %4.4x" % (h1, h2)
> 0588, 0d0a
> >>> h1
> 1416
> >>> h2
> 3338
>
> --
>         Wulfraed         Dennis Lee Bieber               KD6MOG
>         wlfr... at ix.netcom.com     HTTP://wlfraed.home.netcom.com/

Nice, thanks!



More information about the Python-list mailing list