Comment formater la sortie hexadécimale en Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Python est un langage de programmation polyvalent qui permet de travailler avec diverses représentations numériques, y compris l'hexadécimal. Les nombres hexadécimaux sont largement utilisés en informatique pour des tâches telles que la représentation des adresses mémoire, des codes couleur et des données binaires sous une forme plus compacte. Dans ce tutoriel, vous apprendrez à formater la sortie hexadécimale en Python, à comprendre ses concepts de base et à explorer certaines de ses applications pratiques.

Comprendre les bases de l'hexadécimal

L'hexadécimal (souvent abrégé en "hex") est un système numérique de base 16. Contrairement à notre système décimal quotidien qui utilise 10 chiffres (0-9), l'hexadécimal utilise 16 symboles distincts : les chiffres 0-9 et les lettres A-F.

Voici ce que chaque chiffre hexadécimal représente en décimal :

  • 0-9 restent les mêmes qu'en décimal
  • A = 10
  • B = 11
  • C = 12
  • D = 13
  • E = 14
  • F = 15

Conversion binaire en hexadécimal

L'un des principaux avantages de l'hexadécimal est sa relation pratique avec le binaire. Chaque chiffre hexadécimal représente exactement 4 chiffres binaires (bits) :

Binary: 0000 = Hex: 0
Binary: 0001 = Hex: 1
...
Binary: 1010 = Hex: A
...
Binary: 1111 = Hex: F

Créons un script Python simple pour mieux comprendre l'hexadécimal :

  1. Ouvrez l'interface WebIDE (VSCode) dans votre environnement LabEx.
  2. Créez un nouveau fichier nommé hex_basics.py dans le répertoire /home/labex/project.
  3. Ajoutez le code suivant au fichier :
## Understanding decimal, binary, and hexadecimal conversion
decimal_value = 42

## Convert decimal to binary
binary_value = bin(decimal_value)

## Convert decimal to hexadecimal
hex_value = hex(decimal_value)

## Print all representations
print(f"Decimal: {decimal_value}")
print(f"Binary: {binary_value}")
print(f"Hexadecimal: {hex_value}")

## Let's see a larger number
large_decimal = 255
print(f"\nDecimal: {large_decimal}")
print(f"Binary: {bin(large_decimal)}")
print(f"Hexadecimal: {hex(large_decimal)}")
  1. Enregistrez le fichier.
  2. Pour exécuter le script, ouvrez un terminal dans WebIDE et exécutez :
python3 hex_basics.py

Vous devriez voir une sortie similaire à celle-ci :

Decimal: 42
Binary: 0b101010
Hexadecimal: 0x2a

Decimal: 255
Binary: 0b11111111
Hexadecimal: 0xff

Notez que Python ajoute automatiquement des préfixes à ces nombres :

  • Les valeurs binaires sont précédées de 0b
  • Les valeurs hexadécimales sont précédées de 0x

Ces préfixes aident à distinguer les différents systèmes numériques dans le code.

Formatage hexadécimal de base en Python

Maintenant que vous comprenez les bases de l'hexadécimal, apprenons à formater les valeurs hexadécimales en Python. Python offre plusieurs façons de convertir entre le décimal et l'hexadécimal, et de formater la sortie en fonction de vos besoins.

Conversion entre décimal et hexadécimal

Créons un nouveau fichier pour explorer la conversion et le formatage hexadécimaux :

  1. Dans WebIDE, créez un nouveau fichier nommé hex_formatting.py dans le répertoire /home/labex/project.
  2. Ajoutez le code suivant au fichier :
## Basic hexadecimal conversion examples

## Decimal to hex conversion
decimal_number = 171
hex_from_decimal = hex(decimal_number)
print(f"Decimal {decimal_number} converted to hex: {hex_from_decimal}")

## Hex to decimal conversion
hex_number = "0xAB"
decimal_from_hex = int(hex_number, 16)  ## The 16 specifies base-16 (hexadecimal)
print(f"Hex {hex_number} converted to decimal: {decimal_from_hex}")

## You can also use a hex literal directly in your code
hex_literal = 0xAB  ## This is already an integer in Python
print(f"Hex literal 0xAB as decimal: {hex_literal}")

## Working with binary and hexadecimal
binary_number = 0b10101011  ## Binary literal for 171
print(f"Binary {bin(binary_number)} as hex: {hex(binary_number)}")
  1. Enregistrez le fichier.
  2. Exécutez le script en utilisant :
python3 hex_formatting.py

Vous devriez voir une sortie similaire à :

Decimal 171 converted to hex: 0xab
Hex 0xAB converted to decimal: 171
Hex literal 0xAB as decimal: 171
Binary 0b10101011 as hex: 0xab

Comprendre le format de sortie

Comme vous pouvez le constater, lors de la conversion d'un nombre décimal en hexadécimal à l'aide de la fonction hex(), Python renvoie une chaîne avec le préfixe 0x. C'est la représentation standard des nombres hexadécimaux dans de nombreux langages de programmation.

Les lettres minuscules (a-f) sont la valeur par défaut pour la sortie hexadécimale de Python, mais vous pourriez avoir besoin de majuscules ou de formats différents selon votre application.

Modifions notre script pour explorer quelques options de formatage de base :

  1. Ajoutez le code suivant au fichier hex_formatting.py :
## Controlling the case (uppercase/lowercase)
decimal_value = 171

## Default (lowercase)
hex_lowercase = hex(decimal_value)
print(f"\nDefault hex (lowercase): {hex_lowercase}")

## Using string methods to convert to uppercase
hex_uppercase = hex(decimal_value).upper()
print(f"Hex in uppercase: {hex_uppercase}")

## Removing the 0x prefix
hex_no_prefix = hex(decimal_value)[2:]  ## Slicing the string to remove first 2 chars
print(f"Hex without 0x prefix: {hex_no_prefix}")

## Adding padding for consistent width (2 digits with leading zeros)
hex_padded = f"{decimal_value:02x}"  ## Format specifier for 2-digit hex
print(f"Hex padded to 2 digits: {hex_padded}")

## 4-digit hex with leading zeros
hex_padded_4 = f"{decimal_value:04x}"
print(f"Hex padded to 4 digits: {hex_padded_4}")
  1. Enregistrez le fichier.
  2. Exécutez à nouveau le script :
python3 hex_formatting.py

La nouvelle section de sortie devrait ressembler à ceci :

Default hex (lowercase): 0xab
Hex in uppercase: 0XAB
Hex without 0x prefix: ab
Hex padded to 2 digits: ab
Hex padded to 4 digits: 00ab

Cela démontre quelques façons simples de manipuler le format de sortie hexadécimal en Python. Dans l'étape suivante, nous explorerons des options de formatage plus avancées.

Techniques de formatage hexadécimal avancées

Maintenant que vous comprenez les bases de la conversion hexadécimale et du formatage simple, explorons des techniques de formatage plus avancées. Python offre de puissantes capacités de formatage de chaînes qui peuvent être appliquées aux valeurs hexadécimales.

Utilisation des méthodes de formatage de chaînes

Créons un nouveau fichier pour explorer différentes options de formatage :

  1. Dans WebIDE, créez un nouveau fichier nommé advanced_hex_formatting.py dans le répertoire /home/labex/project.
  2. Ajoutez le code suivant au fichier :
## Advanced hexadecimal formatting techniques in Python

decimal_value = 171  ## This will be our example number throughout

print("Different ways to format hexadecimal output in Python:")
print("-" * 50)

## 1. Using format() function
print("\n1. Using the format() function:")
## Basic format (lowercase, no prefix)
print(f"Basic format: {format(decimal_value, 'x')}")
## Uppercase format
print(f"Uppercase: {format(decimal_value, 'X')}")
## With 0x prefix
print(f"With 0x prefix: {format(decimal_value, '#x')}")
## With 0X prefix and uppercase
print(f"With 0X prefix and uppercase: {format(decimal_value, '#X')}")
## Padding to 4 digits
print(f"Padded to 4 digits: {format(decimal_value, '04x')}")
## Padding with spaces
print(f"Padded with spaces: {format(decimal_value, '6x')}")

## 2. Using f-strings (Python 3.6+)
print("\n2. Using f-strings:")
## Basic hex
print(f"Basic format: {decimal_value:x}")
## Uppercase
print(f"Uppercase: {decimal_value:X}")
## With 0x prefix
print(f"With 0x prefix: {decimal_value:#x}")
## With 0X prefix and uppercase
print(f"With 0X prefix and uppercase: {decimal_value:#X}")
## Padding to 4 digits with zeros
print(f"Padded to 4 digits: {decimal_value:04x}")
## Centered in a 10-character field
print(f"Centered: {decimal_value:^10x}")

## 3. Using the str.format() method
print("\n3. Using str.format() method:")
## Basic format
print("Basic format: {:x}".format(decimal_value))
## Uppercase with 0X prefix
print("Uppercase with prefix: {:#X}".format(decimal_value))
## Padding with different align options
print("Right-aligned in 6 spaces: {:>6x}".format(decimal_value))
print("Left-aligned in 6 spaces: {:<6x}".format(decimal_value))
  1. Enregistrez le fichier.
  2. Exécutez le script :
python3 advanced_hex_formatting.py

La sortie affichera diverses options de formatage hexadécimal :

Different ways to format hexadecimal output in Python:
--------------------------------------------------

1. Using the format() function:
Basic format: ab
Uppercase: AB
With 0x prefix: 0xab
With 0X prefix and uppercase: 0XAB
Padded to 4 digits: 00ab
Padded with spaces:     ab

2. Using f-strings:
Basic format: ab
Uppercase: AB
With 0x prefix: 0xab
With 0X prefix and uppercase: 0XAB
Padded to 4 digits: 00ab
Centered:     ab

3. Using str.format() method:
Basic format: ab
Uppercase with prefix: 0XAB
Right-aligned in 6 spaces:     ab
Left-aligned in 6 spaces: ab

Création d'un vidage hexadécimal de tableau d'octets

Une application courante du formatage hexadécimal est la création de vidages hexadécimaux de données binaires. Créons une fonction simple pour afficher un vidage hexadécimal d'un tableau d'octets :

  1. Ajoutez le code suivant au fichier advanced_hex_formatting.py :
## 4. Creating a hex dump of binary data
print("\n4. Creating a hex dump of binary data:")

def hex_dump(data, bytes_per_line=16):
    """Display a hex dump of binary data with both hex and ASCII representation."""
    result = []

    for i in range(0, len(data), bytes_per_line):
        chunk = data[i:i+bytes_per_line]
        ## Create the hex representation
        hex_repr = ' '.join(f'{b:02x}' for b in chunk)

        ## Create the ASCII representation (printable chars only)
        ascii_repr = ''.join(chr(b) if 32 <= b <= 126 else '.' for b in chunk)

        ## Format the line with address, hex values, and ASCII representation
        line = f"{i:04x}: {hex_repr:<{bytes_per_line*3}} {ascii_repr}"
        result.append(line)

    return '\n'.join(result)

## Example: Creating some sample binary data
sample_data = bytes([
    0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21,  ## "Hello World!"
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,  ## Control characters
    0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x7F                                ## More control chars
])

## Print the hex dump
print(hex_dump(sample_data))
  1. Enregistrez le fichier.
  2. Exécutez à nouveau le script :
python3 advanced_hex_formatting.py

La nouvelle section de la sortie affichera un vidage hexadécimal du tableau d'octets :

4. Creating a hex dump of binary data:
0000: 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 01 02 03 Hello World!....
0010: 04 05 06 07 08 09 0a 0b 1a 1b 1c 1d 1e 1f 7f    ...............

Ce format de vidage hexadécimal est couramment utilisé lors de l'examen de données binaires, de paquets réseau ou de contenus de fichiers. Chaque ligne affiche :

  • L'adresse/décalage en hexadécimal
  • Les valeurs hexadécimales de chaque octet
  • La représentation ASCII (où les caractères imprimables sont affichés directement, et les caractères non imprimables sont affichés sous forme de points)

Ces techniques de formatage avancées vous donnent des outils puissants pour travailler avec des données hexadécimales dans vos programmes Python.

Applications pratiques de l'hexadécimal en Python

Maintenant que vous avez appris à formater les valeurs hexadécimales en Python, explorons quelques applications pratiques où le formatage hexadécimal est particulièrement utile.

1. Travailler avec les valeurs de couleur RVB

L'hexadécimal est couramment utilisé pour représenter les couleurs dans le développement web et la programmation graphique. Les valeurs de couleur RVB peuvent être représentées sous forme de triplets hexadécimaux au format #RRGGBB.

Créons un script pour démontrer comment travailler avec les couleurs en utilisant l'hexadécimal :

  1. Dans WebIDE, créez un nouveau fichier nommé hex_color_converter.py dans le répertoire /home/labex/project.
  2. Ajoutez le code suivant au fichier :
## Working with RGB color values using hexadecimal

def rgb_to_hex(r, g, b):
    """Convert RGB values to a hexadecimal color string."""
    ## Ensure values are within valid range (0-255)
    r = max(0, min(255, r))
    g = max(0, min(255, g))
    b = max(0, min(255, b))

    ## Create hex string with ## prefix
    return f"#{r:02x}{g:02x}{b:02x}"

def hex_to_rgb(hex_color):
    """Convert a hexadecimal color string to RGB values."""
    ## Remove ## if present
    hex_color = hex_color.lstrip('#')

    ## Convert hex to decimal
    if len(hex_color) == 3:  ## Handle shorthand hex (#RGB)
        r = int(hex_color[0] + hex_color[0], 16)
        g = int(hex_color[1] + hex_color[1], 16)
        b = int(hex_color[2] + hex_color[2], 16)
    else:  ## Handle full hex (#RRGGBB)
        r = int(hex_color[0:2], 16)
        g = int(hex_color[2:4], 16)
        b = int(hex_color[4:6], 16)

    return (r, g, b)

## Example usage
print("RGB to Hex Color Conversion Examples:")
print("-" * 40)

## Common colors
colors = [
    (255, 0, 0),      ## Red
    (0, 255, 0),      ## Green
    (0, 0, 255),      ## Blue
    (255, 255, 0),    ## Yellow
    (255, 0, 255),    ## Magenta
    (0, 255, 255),    ## Cyan
    (255, 255, 255),  ## White
    (0, 0, 0)         ## Black
]

## Convert and display each color
for rgb in colors:
    hex_color = rgb_to_hex(*rgb)
    print(f"RGB: {rgb} → Hex: {hex_color}")

print("\nHex to RGB Color Conversion Examples:")
print("-" * 40)

## List of hex colors to convert
hex_colors = ["#ff0000", "#00ff00", "#0000ff", "#ff0", "#f0f", "#0ff"]

for hex_color in hex_colors:
    rgb = hex_to_rgb(hex_color)
    print(f"Hex: {hex_color} → RGB: {rgb}")

## Color blending example
print("\nColor Blending Example:")
print("-" * 40)

def blend_colors(color1, color2, ratio=0.5):
    """Blend two colors according to the given ratio."""
    r1, g1, b1 = hex_to_rgb(color1)
    r2, g2, b2 = hex_to_rgb(color2)

    r = int(r1 * (1 - ratio) + r2 * ratio)
    g = int(g1 * (1 - ratio) + g2 * ratio)
    b = int(b1 * (1 - ratio) + b2 * ratio)

    return rgb_to_hex(r, g, b)

## Blend red and blue with different ratios
red = "#ff0000"
blue = "#0000ff"

print(f"Color 1: {red} (Red)")
print(f"Color 2: {blue} (Blue)")

for i in range(0, 11, 2):
    ratio = i / 10
    blended = blend_colors(red, blue, ratio)
    print(f"Blend ratio {ratio:.1f}: {blended}")
  1. Enregistrez le fichier.
  2. Exécutez le script :
python3 hex_color_converter.py

La sortie affichera les conversions entre les formats de couleur RVB et hexadécimal :

RGB to Hex Color Conversion Examples:
----------------------------------------
RGB: (255, 0, 0) → Hex: #ff0000
RGB: (0, 255, 0) → Hex: #00ff00
RGB: (0, 0, 255) → Hex: #0000ff
RGB: (255, 255, 0) → Hex: #ffff00
RGB: (255, 0, 255) → Hex: #ff00ff
RGB: (0, 255, 255) → Hex: #00ffff
RGB: (255, 255, 255) → Hex: #ffffff
RGB: (0, 0, 0) → Hex: #000000

Hex to RGB Color Conversion Examples:
----------------------------------------
Hex: #ff0000 → RGB: (255, 0, 0)
Hex: #00ff00 → RGB: (0, 255, 0)
Hex: #0000ff → RGB: (0, 0, 255)
Hex: #ff0 → RGB: (255, 255, 0)
Hex: #f0f → RGB: (255, 0, 255)
Hex: #0ff → RGB: (0, 255, 255)

Color Blending Example:
----------------------------------------
Color 1: #ff0000 (Red)
Color 2: #0000ff (Blue)
Blend ratio 0.0: #ff0000
Blend ratio 0.2: #cc0033
Blend ratio 0.4: #990066
Blend ratio 0.6: #660099
Blend ratio 0.8: #3300cc
Blend ratio 1.0: #0000ff

2. Travailler avec des données binaires et des opérations sur les fichiers

L'hexadécimal est souvent utilisé lorsque l'on travaille avec des données binaires, telles que le contenu de fichiers ou les paquets réseau. Créons une simple visionneuse de fichiers hexadécimaux :

  1. Dans WebIDE, créez un nouveau fichier nommé hex_file_viewer.py dans le répertoire /home/labex/project.
  2. Ajoutez le code suivant au fichier :
## Hexadecimal file viewer

def hex_dump(data, bytes_per_line=16, offset=0):
    """Create a hex dump of binary data."""
    result = []

    for i in range(0, len(data), bytes_per_line):
        chunk = data[i:i+bytes_per_line]
        ## Hex representation
        hex_part = ' '.join(f'{b:02x}' for b in chunk)
        ## ASCII representation
        ascii_part = ''.join(chr(b) if 32 <= b <= 126 else '.' for b in chunk)

        ## Add line to result
        line = f"{offset+i:08x}:  {hex_part:<{bytes_per_line*3}}  |{ascii_part}|"
        result.append(line)

    return '\n'.join(result)

def create_sample_file():
    """Create a sample binary file for demonstration."""
    file_path = "/home/labex/project/sample.bin"

    ## Create some sample data containing:
    ## - Some text
    ## - A range of values from 0-255
    sample_data = bytearray(b"This is a sample binary file.\n")
    sample_data.extend(range(0, 256))

    ## Write to file
    with open(file_path, 'wb') as f:
        f.write(sample_data)

    return file_path

def view_file_as_hex(file_path, max_bytes=256):
    """View a portion of the file as a hex dump."""
    try:
        with open(file_path, 'rb') as f:
            data = f.read(max_bytes)

        print(f"Hex dump of the first {len(data)} bytes of {file_path}:")
        print("-" * 70)
        print(hex_dump(data))

        if max_bytes < 256:
            print(f"\nOnly showing first {max_bytes} bytes. Adjust max_bytes parameter to see more.")

    except FileNotFoundError:
        print(f"Error: File '{file_path}' not found.")
    except Exception as e:
        print(f"Error reading file: {e}")

## Create a sample file and view it
sample_file = create_sample_file()
view_file_as_hex(sample_file, 128)

## Information about the "hex" command in Linux
print("\nFun fact: In Linux, you can use the 'hexdump' or 'xxd' commands")
print("to view binary files in hexadecimal format directly from the terminal.")
  1. Enregistrez le fichier.
  2. Exécutez le script :
python3 hex_file_viewer.py

La sortie affichera un vidage hexadécimal de l'exemple de fichier binaire :

Hex dump of the first 128 bytes of /home/labex/project/sample.bin:
----------------------------------------------------------------------
00000000:  54 68 69 73 20 69 73 20 61 20 73 61 6d 70 6c 65  |This is a sample|
00000010:  20 62 69 6e 61 72 79 20 66 69 6c 65 2e 0a 00 01  | binary file...|
00000020:  02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11  |................|
00000030:  12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21  |.............. !|
00000040:  22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31  |"#$%&'()*+,-./01|
00000050:  32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41  |23456789:;<=>?@A|
00000060:  42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  |BCDEFGHIJKLMNOPQ|
00000070:  52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61  |RSTUVWXYZ[\]^_`a|

Fun fact: In Linux, you can use the 'hexdump' or 'xxd' commands
to view binary files in hexadecimal format directly from the terminal.

Cette visionneuse hexadécimale affiche à la fois la représentation hexadécimale de chaque octet et son équivalent ASCII, ce qui est un format courant pour examiner les données binaires.

Ces exemples pratiques démontrent comment le formatage hexadécimal peut être utile dans les applications Python du monde réel. De la manipulation des couleurs à l'analyse des données binaires, l'hexadécimal fournit un moyen compact et efficace de représenter et de travailler avec divers types de données.

Résumé

Dans ce tutoriel, vous avez appris :

  • Les fondamentaux du système de numération hexadécimal et sa relation avec le binaire et le décimal
  • Comment convertir des valeurs décimales en hexadécimales et vice versa en Python
  • Diverses techniques de formatage de la sortie hexadécimale, notamment :
    • Conversion de base en utilisant la fonction hex()
    • Formatage avec différents préfixes, remplissages (padding) et options de casse
    • Création de vidages hexadécimaux formatés de données binaires
  • Applications pratiques de l'hexadécimal en Python :
    • Travailler avec les valeurs de couleur RVB dans le développement web et graphique
    • Analyser les données binaires et le contenu des fichiers en utilisant des vidages hexadécimaux

Comprendre le formatage hexadécimal est une compétence essentielle pour de nombreuses tâches de programmation, en particulier lorsque l'on travaille avec des opérations de bas niveau, des données binaires ou des domaines où la représentation compacte est importante. Les techniques que vous avez apprises dans ce tutoriel vous aideront à travailler plus efficacement avec divers formats de données dans vos programmes Python.

Pour approfondir vos connaissances dans ce domaine, vous pouvez explorer :

  • Les opérations bit à bit en Python
  • La programmation réseau et l'analyse de paquets
  • L'infographie et le traitement d'images
  • La gestion de la mémoire et la programmation système