在Python中将十六进制转换为字节

Rayven Esplanada 2023年9月19日
  1. 初始化十六进制值
  2. 使用bytes.fromhex()函数将十六进制转换为字节的Python
  3. 使用binascii模块将十六进制转换为字节的Python
  4. 使用codecs.decode()方法在Python中将十六进制转换为字节
  5. 使用列表推导和int()函数在Python中将十六进制转换为字节
  6. 结论
在Python中将十六进制转换为字节

十六进制,通常简写为hex,使用16个符号(0-9,a-f)表示值,与十进制的10个符号形成对比。例如,十进制中的1000在十六进制中是3E8。

熟练处理十六进制对于涉及二进制数据、内存地址和低级编码的编程任务至关重要。本教程将介绍如何在Python中将十六进制值转换为字节文字。

初始化十六进制值

让我们使用一个字符串创建一个十六进制值,并使用binascii模块中的hexlify()函数将短语A quick brown fox转换成十六进制值。

要将字符串转换为十六进制,我们首先需要将字符串转换为字节。

import binascii

str_val = "A quick brown fox".encode("utf-8")
hex_val = binascii.hexlify(str_val).decode("utf-8")

print(hex_val)

输出:

4120717569636b2062726f776e20666f78

现在,我们已成功将一个字符串转换为十六进制。接下来,让我们继续将十六进制转换回字节。

使用bytes.fromhex()函数将十六进制转换为字节的Python

bytes.fromhex()方法用于将有效的十六进制字符串转换为bytes对象。它的语法如下:

bytes.fromhex(hex_string)
  • hex_string:这是一个必需的参数,表示要转换为字节文字的输入十六进制字符串。

这是bytes.fromhex()方法的工作原理:

  1. 输入验证:该方法首先验证输入的hex_string,以确保它只包含有效的十六进制字符(数字0-9和小写或大写字母A-F)。如果字符串包含任何其他字符,它将引发一个ValueError
  2. 分析对:该方法每次处理两个字符的十六进制字符串,将每对字符视为单个十六进制字节。这意味着对于输入字符串中的每两个字符,生成结果bytes对象中的一个字节。
  3. 转换为字节:每对十六进制字符都转换为其二进制等价物。
  4. 构建bytes对象:当方法处理十六进制字符对时,通过附加每个字节的二进制表示形式来构建一个bytes对象。该过程继续,直到整个输入字符串被处理完毕。
  5. 返回值:一旦整个输入字符串被处理完毕,该方法将返回表示输入十六进制字符串的字节文字等效的bytes对象。

例如,我们将使用之前结果中的十六进制值,并使用fromhex()将其转换为字节文字。

hex_val = "4120717569636b2062726f776e20666f78"

print(bytes.fromhex(hex_val))

输出:

b'A quick brown fox'

让我们分解示例十六进制字符串4120717569636b2062726f776e20666f78,以更好地了解它如何转换为字节文字:

  • 41变成了字节65('A'的ASCII值)。
  • 20变成了字节32(空格的ASCII值)。
  • 71变成了字节113('q'的ASCII值)。
  • 75变成了字节117('u'的ASCII值)。
  • 69变成了字节105('i'的ASCII值)。
  • 63变成了字节99('c'的ASCII值)。
  • 6b变成了字节107('k'的ASCII值)。
  • 20变成了字节32(空格的ASCII值)。
  • 62变成了字节98('b'的ASCII值)。
  • 72变成了字节114('r'的ASCII值)。
  • 6f变成了字节111('o'的ASCII值)。
  • 77变成了字节119('w'的ASCII值)。
  • 6e变成了字节110('n'的ASCII值)。
  • 20变成了字节32(空格的ASCII值)。
  • 66变成了字节102('f'的ASCII值)。
  • 6f变成了字节111('o'的ASCII值)。
  • 78变成了字节120('x'的ASCII值)。

当这些字节组合在一起时,你得到字节文字A quick brown fox,这是最终的结果。

使用binascii模块将十六进制转换为字节的Python

binascii Python模块包含用于二进制和ASCII操作的高效实用函数。特别地,unhexlify()binascii模块内的一个函数,将十六进制值转换为字节文字。

该函数的语法如下:

binascii.unhexlify(hex_string)
  • hex_string:这是一个必需的参数,表示要转换为字节文字的输入十六进制字符串。

以下是它的详细说明:

  1. 输入验证:该方法首先验证hex_string参数,以确保它只包含有效的十六进制字符。输入字符串中的任何无效字符都会导致binascii.Error异常。
  2. 十六进制对转换:然后,该方法以字符对的形式处理hex_string。例如,41表示整数值为65(A的ASCII值)的字节。
  3. 转换成字节:十六进制字节对转换为它们的二进制表示。每对字符转换为相应的字节,其中每个字符表示4位。
  4. 构建字面量:当该方法处理每对字符时,追加生成的二进制字节以形成完整的字节字面量。此过程将继续直到整个输入字符串被处理完毕。
  5. 返回值:一旦整个hex_string被处理,unhexlify()函数将返回生成的字节字面量,表示为一个bytes对象。

让我们用特殊的非ASCII字符初始化一个新的例子,然后将其转换为十六进制值。该例子将是短语A quick brown fox的希腊翻译。

import binascii
from binascii import unhexlify

str_val = "Μια γρήγορη καφέ αλεπού".encode(
    "utf-8"
)  # A quick brown fox in Greek translation
hex_val = binascii.hexlify(str_val).decode("utf-8")

print("String value: ", str_val.decode("utf-8"))
print("Hexadecimal: ", hex_val)
print("Byte value: ", unhexlify(hex_val))

输出:

String value:  Μια γρήγορη καφέ αλεπού
Hexadecimal:  ce9cceb9ceb120ceb3cf81ceaeceb3cebfcf81ceb720cebaceb1cf86cead20ceb1cebbceb5cf80cebfcf8d
Byte value:  b'\xce\x9c\xce\xb9\xce\xb1 \xce\xb3\xcf\x81\xce\xae\xce\xb3\xce\xbf\xcf\x81\xce\xb7 \xce\xba\xce\xb1\xcf\x86\xce\xad \xce\xb1\xce\xbb\xce\xb5\xcf\x80\xce\xbf\xcf\x8d'

我们现在已成功将十六进制值转换为字节。

使用codecs.decode()方法在Python中将十六进制转换为字节

codecs.decode()函数也可以用于将十六进制字符串转换为字节。它是Python的codecs模块的一部分,提供了各种编码和解码功能,用于不同的数据表示。

它的语法如下:

codecs.decode(data, encoding, errors="strict")
  • data:这是表示要解码的数据的必需参数。在这种情况下,它应该是要转换为字节字面量的十六进制字符串。
  • encoding:这也是一个必需参数,用于指定用于解码的编码。当使用十六进制字符串时,应使用hex编码来指示输入字符串表示一个十六进制值。
  • errors(可选):此参数指定如何处理解码错误,例如当输入字符串包含对于指定编码而言是无效字符时。它的默认值是strict,但您可以将其更改为ignorereplace以以不同方式处理错误。

以下是在将其用于解码十六进制值时,该方法的详细说明:

  1. 输入验证:该方法首先检查data参数的有效性,以确保它仅包含有效的十六进制字符。如果输入字符串包含任何非十六进制字符,则会引发带有有关问题字符的详细信息的UnicodeDecodeError
  2. 解码过程:codecs.decode()函数将data参数解释为十六进制字符串,并将其转换为二进制数据。它按字符对的方式处理输入字符串,将每对字符视为单个十六进制字节。
  3. 编码规范:在此上下文中,encoding参数至关重要。当您将'hex'指定为编码时,它告诉Python将输入字符串解释为一个十六进制值,并相应地进行转换。
  4. 转换成字节:随着该方法处理每对十六进制字符,它将它们转换为它们的二进制表示。这种转换会创建一个字节字面量,其中每对字符对应一个单独的字节。
  5. 返回值:codecs.decode()方法将生成的字节字面量作为一个表示解码二进制数据的bytes对象返回。

请参阅下面的示例:

import codecs

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = codecs.decode(hex_val, "hex")
print(byte_val)

此程序使用codecs.decode()函数和编码参数设置为'hex'来解码hex_val字符串。这意味着它将将输入字符串解释为十六进制值,并将其转换为字节。

输出:

b'A quick brown fox'

使用列表推导和int()函数在Python中将十六进制转换为字节

此方法涉及使用列表推导和int()函数将十六进制字符串转换为字节。

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = bytes([int(hex_val[i : i + 2], 16) for i in range(0, len(hex_val), 2)])
print(byte_val)

在这里,代码使用列表推导来对十六进制字符串进行两个字符一对的迭代,将每对字符转换为16进制的整数,并创建这些整数的列表。

bytes() 构造函数然后用于将这个整数列表转换为一个字节对象。

输出:

b'A quick brown fox'

当我们有一个已知结构的十六进制字符串并希望高效地将其转换为字节时,这种方法特别有用。它通过允许我们指定编码基础(在这种情况下为十六进制的基础 16)来提供对转换过程的控制。

结论

在本文中,我们介绍了一些将十六进制值转换为 Python 中的字节文字的方法。

如果您不希望在源代码中添加额外的导入,那么fromhex() 函数是首选。否则,您可以选择最适合您的需求和编码风格的方法。

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 Bytes

相关文章 - Python Hex