On Oct 9, 3:12 am, Dennis Lee Bieber <wlfr...@ix.netcom.com> wrote: > On Thu, 8 Oct 2009 14:52:33 -0700 (PDT), Luc <luc.traonmi...@gmail.com> > declaimed the following in gmane.comp.python.general: > > > > > On Oct 8, 11:13 pm, "Diez B. Roggisch" <de...@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...@ix.netcom.com HTTP://wlfraed.home.netcom.com/
Nice, thanks! -- http://mail.python.org/mailman/listinfo/python-list