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ì
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.>>> 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']
- 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:
6>>> 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']
- 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ừ
0, tệp đầu ra có thể có một tên kỳ lạ. Ví dụ: một tệp có tênTraceback [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ànhTraceback [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ụngTraceback [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: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'
filename, extension = os.path.splitext[args['input_file']]
outfile = filename + "_1.txt"