Hướng dẫn how do you read hex values in python? - làm thế nào để bạn đọc các giá trị hex trong python?

Sử dụng Python 3, hãy giả sử tệp đầu vào chứa các byte mẫu bạn hiển thị. Ví dụ: chúng ta có thể tạo nó như thế này

>>> inp = bytes[[170,12*16+13,255,15]] # i.e. b'\xaa\xcd\xff\x0f'
>>> with open[filename,'wb'] as f:
...     f.write[inp]

Bây giờ, được đưa ra, chúng tôi muốn biểu diễn Hex của từng byte trong tệp đầu vào, thật tuyệt khi mở tệp ở chế độ nhị phân, mà không cố gắng giải thích nội dung của nó là ký tự/chuỗi [hoặc chúng tôi có thể đi theo lỗi ____10]

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']

Nếu tệp lớn, chúng ta có thể muốn đọc một ký tự tại một thời điểm hoặc trong các khối. Với mục đích đó, tôi khuyên bạn nên đọc câu hỏi đáp này

Python 3

Kịch bản hiện không hoạt động trong Python 3. Ví dụ:

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
1 là cú pháp không hợp lệ trong Python 3, sử dụng
>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
2 thay thế [như là một hàm].

Bình luận

Thật tuyệt khi bạn ghi lại mã. Tuy nhiên, một số nhận xét không thêm bất kỳ giá trị nào cho việc đọc trong tương lai:

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
3. Tôi không biết lỗi này là gì và câu trả lời từ Stackoverflow là gì.

Cố gắng sử dụng tài liệu là tốt. Chẳng hạn trong hàm hex2dec:

def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec

Một số điều khác về chức năng trên:

  • Thay vì
    >>> with open[filename,'rb'] as f:
    ...     buff = f.read[] # it reads the whole file into memory
    ...
    >>> buff
    b'\xaa\xcd\xff\x0f'
    >>> out_hex = ['{:02X}'.format[b] for b in buff]
    >>> out_hex
    ['AA', 'CD', 'FF', '0F']
    
    4, có lẽ sử dụng
    >>> with open[filename,'rb'] as f:
    ...     buff = f.read[] # it reads the whole file into memory
    ...
    >>> buff
    b'\xaa\xcd\xff\x0f'
    >>> out_hex = ['{:02X}'.format[b] for b in buff]
    >>> out_hex
    ['AA', 'CD', 'FF', '0F']
    
    5. Trong trường hợp này, nó không quá lớn trong thỏa thuận.
  • Bạn đang lưu trữ kết quả trong một biến và sau đó trả lại biến mà không làm bất cứ điều gì khác với nó. Điều này có nghĩa là bạn cũng có thể trả lại kết quả ngay lập tức:
    >>> with open[filename,'rb'] as f:
    ...     buff = f.read[] # it reads the whole file into memory
    ...
    >>> buff
    b'\xaa\xcd\xff\x0f'
    >>> out_hex = ['{:02X}'.format[b] for b in buff]
    >>> out_hex
    ['AA', 'CD', 'FF', '0F']
    
    6
  • Vì nó đang sử dụng chức năng tích hợp trong mà không có bất kỳ hoạt động nào khác, chức năng có cần thiết không?

Chạy nó!

Như đã nói ở trên, sử dụng Python 3 không thể chạy nó. Thay đổi các câu lệnh in thành các chức năng đã khắc phục vấn đề này. Python 2 cũng hỗ trợ chức năng

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
2, vì vậy nó cũng không có vấn đề gì khi chạy trên Python 2.

Chương trình chạy như mong đợi với một tệp chính xác và tạo một tệp đầu ra với các giá trị được chuyển đổi.

Chạy nó bằng một tệp không hợp lệ hoặc không có đối số nào ở tất cả, làm hỏng chương trình với

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
8 hoặc
>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
9 tương ứng. Nếu một tệp được đưa ra tồn tại nhưng có giá trị hexadecimal không hợp lệ trong đó [ví dụ như một chuỗi ngẫu nhiên], chương trình cũng gặp sự cố:

Traceback [most recent call last]:
  File "hex2dec.py", line 22, in 
    converted = str[hex2dec [i]]
  File "hex2dec.py", line 7, in hex2dec
    result_dec = int[hex, 0]
ValueError: invalid literal for int[] with base 0: 'random word'

Các lỗi trên cho chúng tôi biết chúng tôi cần kiểm tra lỗi.

Lỗi đầu tiên để giải quyết sẽ là

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
9 không đưa ra tên tệp là đối số khi chạy chương trình. Điều này có thể được giải quyết bằng cách sử dụng mô -đun CLI như
def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec
1,
def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec
2 hoặc có lẽ là một mô -đun khác mà bạn thích. Cá nhân tôi sử dụng Argparse, vì nó khá đơn giản và nó là một phần của thư viện tiêu chuẩn.

Các đối số:

import argparse


def get_cli_parser[]:
    parser = argparse.ArgumentParser[description='Describe what your program does']
    parser.add_argument['input_file', type=str,
                        help='The file to read the hexadecimal values from'
    return parser


if __name__ == '__main__':
    parser = get_cli_parser[]
    args = vars[parser.parse_args[]]

Tại thời điểm này, bạn có thể truy cập các đối số dòng lệnh

def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec
3 dưới dạng từ điển.

Phần

def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec
4 của mã chỉ được áp dụng nếu nó chạy dưới dạng tập lệnh. Điều này có nghĩa là nếu tệp được nhập dưới dạng mô -đun, điều này sẽ không chạy. Xem thêm câu trả lời này để biết thêm thông tin.

Khi chúng tôi chạy mã trên mà không có bất kỳ đối số nào, chúng tôi sẽ nhận được như sau:

usage: hex2dec2.py [-h] input_file
hex2dec2.py: error: the following arguments are required: input_file

Tiếp theo là

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
8. Cái này khá dễ giải quyết: Trước khi mở tệp, hãy kiểm tra xem nó có tồn tại bằng mô -đun
def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec
6 đã được nhập không:

if not os.path.exists[args['input_file']]:
    print['Input file does not exist, please try again']
    return

>>> with open[filename,'rb'] as f:
...     buff = f.read[] # it reads the whole file into memory
...
>>> buff
b'\xaa\xcd\xff\x0f'
>>> out_hex = ['{:02X}'.format[b] for b in buff]
>>> out_hex
['AA', 'CD', 'FF', '0F']
9 cuối cùng có thể được giải quyết theo một số cách. Một người sẽ là sử dụng Regex trên dòng hiện tại của tệp để tìm bất kỳ giá trị thập lục phân nào. Giả sử chỉ có các giá trị thập lục phân nên nằm trên một dòng, nó trở nên đơn giản hơn rất nhiều. Chúng tôi chỉ có thể kiểm tra xem dòng bắt đầu với
def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec
8 [ví dụ: giá trị thập lục phân].

Đọc tệp cũng nên được thực hiện theo từng dòng dưới dạng trình lặp, để ngăn các tệp khổng lồ làm hỏng chương trình của bạn bằng cách tiêu thụ bộ nhớ quá cao. Ngay bây giờ chương trình đọc tất cả các văn bản trong tệp vào bộ nhớ. Điều này có thể được thực hiện như mô tả trong

def hex2dec[hex]:
    """Convert a hexadecimal string to a decimal number"""
    result_dec = int[hex, 0]
    return result_dec
9:

with open[input_file] as input_file:
    for line in input_file:
        # rest of code here.

Đặt điều này trong một chức năng của riêng nó cũng ngăn bạn mở tệp liên tục.

Sản phẩm cuối cùng

import argparse
import os


def write_and_print_result[args, result]:
    """Write every result to the output file 
    and print each converted value
    """
    out_file = args['input_file'][:-4] + "_1.txt"
    with open[out_file, 'a+'] as output:
        for converted in result:
            output.write[converted + "\n"]
            print['Converted: {}'.format[converted]]


def read_and_convert_file[args]:
    """Read the given input file and convert each hexadecimal value
    to decimal value
    """
    result = []
    with open[args['input_file']] as input_file:
        for line in input_file:
            if [line.startswith['0x']]:
                result.append[str[int[line, 0]]]
    write_and_print_result[args, result]


def get_cli_parser[]:
    parser = argparse.ArgumentParser[description="Describe program here"]
    parser.add_argument['input_file', type=str,
                        help='The file to read the hexadecimal values from']
    return parser


def cli_runner[]:
    parser = get_cli_parser[]
    args = vars[parser.parse_args[]]

    if not os.path.exists[args['input_file']]:
        print['Input file does not exist, please try again.']
        return

    read_and_convert_file[args]


if __name__ == '__main__':
    cli_runner[]

Như bạn có thể thấy, hầu hết là kiểm tra lỗi hoặc đối số dòng lệnh. Chuyển đổi thực tế chỉ là một dòng mã.

Cái gì tiếp theo

Một vấn đề tôi vẫn tìm thấy:

  • Nếu tệp đầu vào là bất cứ điều gì ngoại trừ
    Traceback [most recent call last]:
      File "hex2dec.py", line 22, in 
        converted = str[hex2dec [i]]
      File "hex2dec.py", line 7, in hex2dec
        result_dec = int[hex, 0]
    ValueError: invalid literal for int[] with base 0: 'random word'
    
    0, tệp đầu ra có thể có một tên kỳ lạ. Ví dụ: một tệp có tên
    Traceback [most recent call last]:
      File "hex2dec.py", line 22, in 
        converted = str[hex2dec [i]]
      File "hex2dec.py", line 7, in hex2dec
        result_dec = int[hex, 0]
    ValueError: invalid literal for int[] with base 0: 'random word'
    
    1 sẽ đơn giản trở thành
    Traceback [most recent call last]:
      File "hex2dec.py", line 22, in 
        converted = str[hex2dec [i]]
      File "hex2dec.py", line 7, in hex2dec
        result_dec = int[hex, 0]
    ValueError: invalid literal for int[] with base 0: 'random word'
    
    2, không mô tả lắm. Để khắc phục điều này, như được chỉ ra bởi @Mathias Ettinger, bạn có thể sử dụng
    Traceback [most recent call last]:
      File "hex2dec.py", line 22, in 
        converted = str[hex2dec [i]]
      File "hex2dec.py", line 7, in hex2dec
        result_dec = int[hex, 0]
    ValueError: invalid literal for int[] with base 0: 'random word'
    
    3. Nó được sử dụng như vậy:
filename, extension = os.path.splitext[args['input_file']]
outfile = filename + "_1.txt"

Làm cách nào để giải mã một tệp hex trong python?

Làm cách nào để giải mã một tệp hex trong Python ?..
HexString = "4869".
A_String = byte. Fromhex [hexstring].
A_String = a_String. Decode ["ASCII"].
print[a_string].

Làm thế nào để bạn đọc các giá trị thập lục phân?

Chín số đầu tiên [0 đến 9] là cùng một số thường được sử dụng trong hệ thống thập phân.Sáu số hai chữ số tiếp theo [10 đến 15] được biểu diễn bằng các chữ cái từ A đến F. Đây là cách hệ thống HEX sử dụng các số từ 0 đến 9 và các chữ cái viết hoa A đến F để biểu diễn số thập phân tương đương.uses the numbers from 0 to 9 and the capital letters A to F to represent the equivalent decimal number.

Giá trị hex trong Python là gì?

Chức năng Python hex [] được sử dụng để chuyển đổi một số nguyên thành chuỗi thập lục phân chữ thường được đặt trước với số 0x 0x.Chúng ta cũng có thể chuyển một đối tượng cho hàm hex [], trong trường hợp đó, đối tượng phải có hàm __index __ [] được xác định trả về số nguyên.Đối số số nguyên đầu vào có thể nằm trong bất kỳ cơ sở nào như nhị phân, bát phân, v.v.used to convert an integer to a lowercase hexadecimal string prefixed with “0x”. We can also pass an object to hex[] function, in that case the object must have __index__[] function defined that returns integer. The input integer argument can be in any base such as binary, octal etc.

Làm thế nào để bạn đọc byte như hex trong python?

Cách đơn giản nhất là sử dụng hàm tích hợp hex [] cho một byte theo nghĩa đen.Ngoài ra, hàm hexlify [] từ mô -đun Binascii cũng có thể được sử dụng để tạo ra cùng một đầu ra.use the built-in function hex[] to a byte literal. Alternatively, the hexlify[] function from the binascii module can also be used to produce the same output.

Bài Viết Liên Quan

Chủ Đề