Hướng dẫn how do you decode a hex string in python? - làm thế nào để bạn giải mã một chuỗi hex trong python?

79

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Trong Python 2, việc chuyển đổi dạng thập lục phân của chuỗi thành unicode tương ứng là đơn giản:

comments.decode("hex")

trong đó biến 'bình luận' là một phần của dòng trong một tệp (phần còn lại của dòng không cần phải chuyển đổi, vì nó chỉ được biểu diễn trong ASCII.

Tuy nhiên, bây giờ trong Python 3, điều này không hoạt động (tôi giả sử vì công tắc byte/chuỗi so với chuỗi/unicode. Tôi cảm thấy như nên có một lớp trong Python 3 để làm điều tương tự, thay vì đọc toàn bộ dòng dưới dạng một loạt byte (mà tôi không muốn làm) và sau đó chuyển đổi từng phần của dòng. Nếu có thể, tôi muốn đọc toàn bộ dòng dưới dạng chuỗi Unicode (vì phần còn lại của Dòng này nằm trong Unicode) và chỉ chuyển đổi phần này từ một đại diện thập lục phân.

hỏi ngày 19 tháng 7 năm 2010 lúc 18:44Jul 19, 2010 at 18:44

Hướng dẫn how do you decode a hex string in python? - làm thế nào để bạn giải mã một chuỗi hex trong python?

Chimeracoderchimeracoderchimeracoder

Huy hiệu vàng 19.8K2020 gold badges60 silver badges59 bronze badges

1

Cái gì đó như:

>>> bytes.fromhex('4a4b4c').decode('utf-8')
'JKL'

Chỉ cần đặt mã hóa thực tế bạn đang sử dụng.

Đã trả lời ngày 19 tháng 7 năm 2010 lúc 18:54Jul 19, 2010 at 18:54

6

import codecs

decode_hex = codecs.getdecoder("hex_codec")

# for an array
msgs = [decode_hex(msg)[0] for msg in msgs]

# for a string
string = decode_hex(string)[0]

Đã trả lời ngày 16 tháng 1 năm 2014 lúc 15:40Jan 16, 2014 at 15:40

NiklasniklasNiklas

21.2K32 Huy hiệu vàng121 Huy hiệu bạc165 Huy hiệu đồng32 gold badges121 silver badges165 bronze badges

1

Các câu trả lời từ @unbeli và @niklas là tốt, nhưng câu trả lời của @UNCELI không hoạt động cho tất cả các chuỗi Hex và mong muốn thực hiện giải mã mà không cần nhập thêm thư viện (codec). Những điều sau đây sẽ hoạt động (nhưng sẽ không hiệu quả cho các chuỗi lớn):

>>> result = bytes.fromhex((lambda s: ("%s%s00" * (len(s)//2)) % tuple(s))('4a82fdfeff00')).decode('utf-16-le')
>>> result == '\x4a\x82\xfd\xfe\xff\x00'
True

Về cơ bản, nó hoạt động xung quanh việc có các byte UTF-8 không hợp lệ bằng cách đệm với số không và giải mã là UTF-16.

Đã trả lời ngày 12 tháng 9 năm 2019 lúc 18:42Sep 12, 2019 at 18:42

HackerbosshackerbossHackerBoss

8197 Huy hiệu bạc16 Huy hiệu Đồng7 silver badges16 bronze badges

1

  • Cách chuyển đổi này hoạt động
  • Sử dụng codecs.decode
  • Nối Hex vào chuỗi

Đây là một hướng dẫn về cách chuyển đổi số thập lục phân thành các chuỗi trong Python. Khi làm việc với các số HEX, có thể khó đọc hoặc so sánh chúng, vì vậy việc chuyển đổi chúng thành các chuỗi sẽ làm cho quá trình dễ dàng hơn.

Cách dễ nhất để chuyển đổi giá trị thập lục phân sang chuỗi là sử dụng hàm từHex ().fromhex() function.

print(bytes.fromhex('68656c6c6f').decode('utf-8'))(bytes.fromhex('68656c6c6f').decode('utf-8'))

Hàm này lấy giá trị thập lục phân làm tham số và chuyển đổi nó thành một chuỗi. Hàm giải mã () giải mã bytearray và trả về một chuỗi ở định dạng UTF-8.decode() function decodes bytearray and returns a string in utf-8 format.

Lưu ý rằng trong chuỗi chỉ có các số từ 0 đến 9 và các chữ cái từ trên A A đến F F F. Nếu bạn đặt bất kỳ chữ cái nào khác, Python sẽ trả lại lỗi:

ValueError: Số không phải là HexAdecimal được tìm thấy infromhex () arg ở vị trí0:non-hexadecimal number found infromhex()arg at position0

Bạn có thể nhanh chóng chuyển đổi chuỗi này trở lại Hex bằng mã này:

Phải có những người khác ở đầu chuỗi cho biết giá trị được chuyển đổi thành byte.

Cách chuyển đổi này hoạt động

Nếu bạn chia chuỗi này thành các giá trị riêng lẻ, bạn sẽ nhận được:

0x 0x & NBSP; Lúc đầu có nghĩa là giá trị nên được coi là giá trị thập lục phân.  at the beginning means that the value should be treated as a hexadecimal value.

Bảng này cho thấy cách mỗi giá trị được chuyển đổi thành một chữ cái.

Hex Tháng mười hai Hoạt động Ascii
0x68 104 6*16^1 + 8*16^0 = 6*16 + 8*1 = 104*16^1 + 8*16^0 = 6*16 + 8 * 1 = 104 h
0x65 101 6*16^1 + 5*16^0 = 6*16 + 5*1 = 101*16^1 + 5*16^0 = 6*16 + 5 * 1 = 101 e
0x6c 108 6*16^1 + 12*16^0 = 6*16 + 12*1 = 108*16^1 + 12*16^0 = 6*16 + 12 * 1 = 108 l
0x6c 108 6*16^1 + 12*16^0 = 6*16 + 12*1 = 108*16^1 + 12*16^0 = 6*16 + 12 * 1 = 108 l
0x6f 111 6*16^1 + 15*16^0 = 6*16 + 15*1 = 111*16^1 + 15*16^0 = 6*16 + 15 * 1 = 111 o

Sử dụng codecs.decode

Codecs.Decode là một phương pháp khác bạn có thể sử dụng để đạt được kết quả tương tự. Phải mất ba đối số: đối tượng byte, mã hóa và lỗi (chỉ định cách xử lý lỗi).codecs.decode is another method you can use to achieve the same result. It takes three arguments: the bytes object, encoding, and error (specifies how errors should be handled).

Nhập khẩucodecs

my_string="68656c6c6f"="68656c6c6f"

my_string_bytes=bytes(my_string,encoding='utf-8')=bytes(my_string,encoding='utf-8')

binary_string=codecs.decode(my_string_bytes,"hex")= codecs.decode(my_string_bytes,"hex")

print(str(binary_string,'utf-8'))(str(binary_string,'utf-8'))

Biến MY_STRING_BYTES chuyển đổi một chuỗi thành byte bằng UTF-8. Bây giờ, biến này có thể được truyền như là đối số đầu tiên. Đối số thứ hai là Hex Hex, vì chúng tôi muốn chuyển đổi giá trị hex thành một chuỗi.my_string_bytes variable converts a string to bytes using utf-8. Now, this variable can be passed as the first argument. The second argument is “hex” as we want to convert the hex value to a string.

Mã này trả về cùng một chuỗi như trước:

Nối Hex vào chuỗi

Để nối một giá trị thập lục phân vào một chuỗi, trước tiên, bạn phải chuyển đổi nó và sau đó sử dụng nó để tham gia hai chuỗi này.

Đối với điều này, chúng tôi sẽ sử dụng một hàm chuyển đổi HEX thành chuỗi và trả lại nó dưới dạng chuỗi.

defhex_to_string(hex):hex_to_string(hex):

    ifhex[:2]=='0x':ifhex[:2]=='0x':

        hex=hex[2:]hex= hex[2:]

    string_value=bytes.fromhex(hex).decode('utf-8')string_value=bytes.fromhex(hex).decode('utf-8')

    returnstring_valuereturnstring_value

hex_value='0x737472696e67' ='0x737472696e67'

Chuỗi = 'Đây chỉ là một'+hex_to_string ('737472696e67'))='This is just a '+hex_to_string('737472696e67')

print(string)(string)

Đôi khi, giá trị hex có thể được đi trước bởi 0x 0x. Chức năng của chúng tôi kiểm tra xem đây có phải là trường hợp hay không và loại bỏ hai ký tự này khỏi chuỗi.

Bởi vì hàm trả về một giá trị chuỗi, nó có thể được nối với một chuỗi khác.

Đây là giá trị trả lại.

Làm thế nào để bạn giải mã một chuỗi được mã hóa hex trong Python?

Sử dụng byte ...
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ị hex trong python?

Chỉ cần thay đổi s để mở (tên tệp).đọc () và bạn nên tốt ...
OD (Dump Octal, có tùy chọn -x hoặc -t x).
hexdump..
Tiện ích XD có sẵn trong Windows ..
Các công cụ kết xuất hex trực tuyến, chẳng hạn như cái này ..

Làm thế nào để bạn giải mã thập lục phân?

Chuyển đổi Hex thành thập phân..
Bắt đầu với chữ số bên phải của giá trị hex của bạn.....
Di chuyển một chữ số sang trái.....
Di chuyển một chữ số khác còn lại.....
Tiếp tục nhân mỗi chữ số gia tăng của giá trị HEX bằng cách tăng sức mạnh của 16 (4096, 65536, 1048576, ...) và ghi nhớ từng sản phẩm ..

Làm thế nào để bạn loại bỏ 0x khỏi hex trong python?

Phương pháp 1: Cắt để bỏ qua tiền tố, sử dụng cắt và bắt đầu với INDEX 2 trên chuỗi thập lục phân.Ví dụ, để bỏ qua tiền tố '0x' về kết quả của x = hex (42) = '0x2a', sử dụng thao tác cắt x [2:] dẫn đến số lượng hình lục giác '2a' mà không có tiền tố '0x'.use slicing and start with index 2 on the hexadecimal string. For example, to skip the prefix '0x' on the result of x = hex(42) ='0x2a' , use the slicing operation x[2:] that results in just the hexadecimal number '2a' without the prefix '0x' .