guo
guo

Reputation: 295

Python: Convert hex string to int and back

My python script gets and sends words over a serial line. Each word is a signed 24-bit value, received as hex string. The script should now take these strings and convert them to integers, do some calculations on it, and send them back in the same format. My problem is, how to do this conversion

Examples

Rx string -> calc int
 012345   ->  74565
 fedcba   -> -74566

calc int -> Tx string
  74565  -> 012345
 -74566  -> fedcba

How can this be done?

Upvotes: 3

Views: 15415

Answers (3)

cfi
cfi

Reputation: 11300

(Edit: An oversight on my part. See Rob's answer for correctly covering the negative sign numbers)

If you just want to convert a hex string into an int, do e.g.:

>>> int('0xff', 16)
255
>>> int('0xdaad', 16)
55981

The reverse can be done with the hex() function. From the help page:

Help on built-in function hex in module builtins:

>>> help(hex)
hex(...)
    hex(number) -> string

    Return the hexadecimal representation of an integer.

       >>> hex(3735928559)
       '0xdeadbeef'

It should be trivial to remove or add the '0x' if it's missing in your data stream. Here's an example to ensure padding to 6 chars (representing 3 bytes = 24 bits):

>>> '0x' + hex(255)[2:].rjust(6, '0')
'0x0000ff'

If you get the data in 3 byte form (24 bits), you can use int.to_bytes() and int.from_bytes() as described in the Python docs. This is new in Python 3.2.

Upvotes: 2

Darko P.
Darko P.

Reputation: 595

$ pip install bitstring

Then:

from bitstring import BitStream
s1 = BitStream('0x012345')
s1.int # 74565
s2 = BitStream(int=-74565, length=24)
s2.hex # fedcbb

Upvotes: 1

Robᵩ
Robᵩ

Reputation: 168836

def str_to_int(s):
    i = int(s, 16)
    if i >= 2**23:
        i -= 2**24
    return i

def int_to_str(i):
    return '%06x'%((i+2**24)%2**24)

Test results:

In [36]: str_to_int('012345')
Out[36]: 74565

In [37]: str_to_int('fedcba')
Out[37]: -74566

In [38]: int_to_str(74565)
Out[38]: '012345'

In [39]: int_to_str(-74566)
Out[39]: 'fedcba'

Reference: Hex string to signed int in Python 3.2?

Upvotes: 5

Related Questions