Conversion from string to integer

X

xkenneth

Hi,

I've been attempting to write a serial program in python. I talk to
a custom designed bit of hardware that sends me back groups that are 2
bytes in length. When i recieve them using either pySerial or USPP i'm
not sure how python interprets them. Both of the bytes should be
interpreted as one integer. I store each of the two bytes in a python
array. Here is an example of the data as printed in a terminal.

['\x1dz', '\xa8<', '\x89{', '}O', 'r\xaf', '\x83\xcd', '\x81\xba',
'\x00\x02', '\x00\x00', '\x00\x00', '\x00\x00']

As you can see it either chooses to represent one byte in hex or one in
ascii or both in hex etc. I'm just not sure how to get this into an
integer format.

Thanks for the help.

Regards,
Ken
 
P

Peter Otten

xkenneth said:
I've been attempting to write a serial program in python. I talk to
a custom designed bit of hardware that sends me back groups that are 2
bytes in length. When i recieve them using either pySerial or USPP i'm
not sure how python interprets them. Both of the bytes should be
interpreted as one integer. I store each of the two bytes in a python
array. Here is an example of the data as printed in a terminal.

['\x1dz', '\xa8<', '\x89{', '}O', 'r\xaf', '\x83\xcd', '\x81\xba',
'\x00\x02', '\x00\x00', '\x00\x00', '\x00\x00']

As you can see it either chooses to represent one byte in hex or one in
ascii or both in hex etc. I'm just not sure how to get this into an
integer format.

Your data consists entirely of two-byte strings; don't get fooled by the way
Python represents them. To convert them you need struct.unpack() which
seems to be in high demand today:
data = ['\x1dz', '\xa8<', '\x89{', '}O', 'r\xaf', '\x83\xcd',
'\x81\xba',
.... '\x00\x02', '\x00\x00', '\x00\x00', '\x00\x00']
print [struct.unpack("h", s)[0] for s in data]
[7546, -22468, -30341, 32079, 29359, -31795, -32326, 2, 0, 0, 0]

Of course "h" is only one of the candidates for the format parameter. See
http://docs.python.org/lib/module-struct.html for the complete list.

Peter
 
M

Mark Warburton

You want something like this:
a = '\x1dz'
(ord(a[0])<<8) + ord(a[1])
7546

Each of the two characters represents one byte of a 16-bit integer. It
doesn't matter if they are ascii or hex -- there are still exactly two
bytes in each of your strings.

The ord() function converts a character to its 8-bit ASCII code. The
<< operator shifts the first character 8 bits to the left. Note that
the byte order might need to be swapped, depending on the
implementation of your custom hardware. e.g. (ord(a[1])<<8) +
ord(a[0])
 
T

Terry Reedy

xkenneth said:
Hi,

I've been attempting to write a serial program in python. I talk to
a custom designed bit of hardware that sends me back groups that are 2
bytes in length. When i recieve them using either pySerial or USPP i'm
not sure how python interprets them. Both of the bytes should be
interpreted as one integer. I store each of the two bytes in a python
array. Here is an example of the data as printed in a terminal.

['\x1dz', '\xa8<', '\x89{', '}O', 'r\xaf', '\x83\xcd', '\x81\xba',
'\x00\x02', '\x00\x00', '\x00\x00', '\x00\x00']

As you can see it either chooses to represent one byte in hex or one in
ascii or both in hex etc. I'm just not sure how to get this into an
integer format.

Look at array and/or struct modules/
 
G

Grant Edwards

Ahh, right. Batteries included! Thanks for the enlightenment. :)

I think that's the third time _today_ that question has been
answered. Where can we put that information such that you
would have found it?
 
M

Mark Warburton

Grant said:
I think that's the third time _today_ that question has been
answered. Where can we put that information such that you
would have found it?

Don't ask me -- I didn't ask the original question! I just answered it
in a different way.
 

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,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top