在 Python 中转换十六进制字符串为 Int

Rayven Esplanada 2023年1月30日 2020年12月19日
  1. 在 Python 中使用 int() 将十六进制转换为 Int
  2. 在 Python 中把无前缀的十六进制字符串转换为 Int
  3. 在 Python 中把带前缀的十六进制字符串转换为 Int
  4. 在 Python 中把小字节序和大字节序十六进制字符串转换为英特值
  5. 在 Python 中把十六进制转换为有符号的整数
在 Python 中转换十六进制字符串为 Int

本教程将演示如何在 Python 中把十六进制字符串转换为 int。它将涵盖不同的十六进制格式,如有符号的、小写的、大写的、0x 注释的十六进制,以及默认的十六进制字符串。

在 Python 中使用 int() 将十六进制转换为 Int

在 Python 中,将十六进制转换为整数的最常见和最有效的方法是使用类型转换函数 int()

这个函数接受两个参数:一个是强制参数,即要转换的值,另一个是可选参数,即数字格式的基数,默认为 10

其他的数字格式有 2 代表二进制,8 代表八进制,16 代表十六进制。如果你把 0 作为基础值的参数,它将从值的前缀中得出数字格式。如果没有任何前缀,它将自动识别为十进制,0b 为二进制,0o 为八进制,0x 为十六进制。

在 Python 中把无前缀的十六进制字符串转换为 Int

如果十六进制字符串没有前缀,则指定 int() 函数的基值为 16。

例如:

hex_val = 'beef101'

print(int(hex_val, 16))

输出:

200208641

结果是十六进制值 beef101 的十进制或整数转换。

在 Python 中把带前缀的十六进制字符串转换为 Int

如果十六进制字符串有一个前缀 0x,那么将基值参数改为 0 以自动检测前缀。

你仍然可以传递 16 作为基数,但如果你要处理多个不同格式的数字值,则传递 0 是最好的方法。

hex_val = '0xdeadcab'

print(int(hex_val, 0))
print(int(hex_val, 16))

输出:

233495723
233495723

在 Python 中把小字节序和大字节序十六进制字符串转换为英特值

小字节序和大字节序是十六进制的两种排序系统。默认的排序方式是小 endian,它将最重要的数字放在序列的最右边,而大 endian 则相反。

考虑到这一点,我们要考虑的就是将大尾数的十六进制值转换为小尾数。之后,现在就可以对其进行通常的转换了。

要将一个大尾数十六进制字符串转换为小尾数的十六进制字符串,使用 bytearray.fromhex(),并对结果使用 reverse() 函数。之后,将十六进制值转换回字符串,并将其转换为整数。

big_endian = 'efbe'

def to_little(val):
  little_hex = bytearray.fromhex(val)
  little_hex.reverse()
  print("Byte array format:", little_hex)

  str_little = ''.join(format(x, '02x') for x in little_hex)

  return str_little

little_endian = to_little(big_endian)

print("Little endian hex:", little_endian)
print("Hex to int:", int(little_endian, 16))

总结一下这段代码。

  • 调用 bytearray.fromhex() 将大字节序的十六进制字符串转换成字节数组的十六进制值。
  • 将字节数组反转,将大字节序转换成小字节序格式。
  • 将字节数组的值反转为小字节序的字符串十六进制格式。
  • 使用 int() 将字符串转换为整数。

输出:

Byte array format: bytearray(b'\xbe\xef')
Little endian hex: beef
Hex to int: 48879

在 Python 中把十六进制转换为有符号的整数

将任何数字格式转换为有符号的整数,都需要一个叫做 Two’s Complement的操作,这是一个针对有符号的数字进行计算的位性数学运算。

所以在我们将十六进制转换成有符号的整数之前,我们需要定义一个函数来执行二进制补码运算。

def twosComplement_hex(hexval):
    bits = 16 # Number of bits in a hexadecimal number format
    val = int(hexval, bits)
    if val & (1 << (bits-1)):
    val -= 1 << bits
    return val

二进制值中最左边的位被称为有符号位,决定整数是正数还是负数。这个函数将保留该位作为有符号的位,并通过使用位向左移位运算符 << 来移位其他位进行补偿。

现在,继续进行十六进制值到有符号 int 的实际转换。

hex_val1 = 'ff'
hex_val2 = 'ffff'
hex_val3 = 'aaff'

def twosComplement_hex(hexval):
    bits = 16
    val = int(hexval, bits)
    if val & (1 << (bits-1)):
        val -= 1 << bits
    return val
  
print(twosComplement_hex(hex_val1))
print(twosComplement_hex(hex_val2))
print(twosComplement_hex(hex_val3))

输出:

255
-1
-21761

现在,我们已经实现了将一个十六进制字符串转换为有符号的整数。

总之,我们已经涵盖了将不同类型的十六进制格式转换为有符号和无符号整数的方法。使用 int() 与值和基数参数一起将十六进制转换为无符号整数。

如果十六进制是大字节序格式,先用 bytearray.fromhex()reverse() 将其转换为小字节序格式。

最后,如果需要将十六进制字符串转换为有符号的整数,那么对其上的十六进制值进行二进制补码运算,得到一个有符号的整数值。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

相关文章 - Python Hex

相关文章 - Python Integer