2011-12-09 76 views
8

Trong trăn, làm thế nào để chuyển đổi một chuỗi ASCII hex thành chuỗi nhị phân?Trong python, làm thế nào để chuyển đổi một chuỗi ascii hex thành chuỗi nhị phân nội bộ thô?

Ví dụ:

01000001B8000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435362021222324

nhu cầu được chuyển đổi thành một chuỗi nhị phân. (0A cần phải được chuyển đổi sang 1010, không để ASCII chút 1000001 đó là 65)

chỉnh sửa: Thay đổi "nhị phân thô" trong câu hỏi để "liệu nội bộ nhị phân" chuỗi cho rõ ràng hơn.

+1

ý bạn là gì bởi _binary string_? nó là một chuỗi hoặc một danh sách các số nguyên mà bạn quan tâm? – moooeeeep

+0

Tôi có nghĩa là đại diện nhị phân nội bộ. Tôi nhận được câu trả lời là base64.b16decode –

Trả lời

13
import base64 
data = base64.b16decode("01000001B8000102030405") 
9

Đây có phải là những gì bạn đang tìm kiếm không?

hex_string = '0A' 
'{0:b}'.format(int(hex_string, 16)) 
# returns '1010' 

hoặc

''.join('{0:04b}'.format(int(c, 16)) for c in hex_string) 
+0

cảm ơn. Nhưng chuỗi của tôi rất dài. Nó sẽ không vừa với một số nguyên. Các nhị phân chuyển đổi sẽ đi đến một số loại cấu trúc bộ nhớ liên tục như mảng hoặc như vậy. –

+0

@LunarMushrooms - điều này cũng làm việc với chuỗi ví dụ của bạn. Nhưng tôi đã thêm một phiên bản đặc biệt cho bạn ... – eumiro

+2

Bạn thậm chí có thử điều này trên chuỗi của mình không? Nó hoạt động tuyệt vời ('int's thể có bất kỳ kích thước):' '100000000000000000000000110111000000000000000000100000010000000110000010000000101000001100000011100001000000010010000101000001011000011000000110100001110000011110001000000010001000100100001001100010100000101010001011000010111000110000001100100011010000110110001110000011101000111100001111100100000001000010010001000100011001001000010010100100110001001110010100000101001001010100010101100101100001011010010111000101111001100000011000100110010001100110011010000110101001101100010000000100001001000100010001100100100'' –

2

Tôi không hoàn toàn chắc chắn những gì bạn có ý nghĩa bởi một "chuỗi nhị phân". Nếu bạn ngụ ý một chuỗi lưu trữ dữ liệu nhị phân, bạn có thể sử dụng the binascii module.

>>> data = "01000001B8000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435362021222324" 
>>> import binascii 
>>> binary = binascii.a2b_hex(data) 
>>> binary 
'\x01\x00\x00\x01\xb8\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./!"#$' 

Tuy nhiên, nếu bạn thực sự muốn có một chuỗi chứa rất nhiều "0" s và "1" s bạn cần phải đi một đoạn xa hơn:

>>> "".join("{:08b}".format(ord(i)) for i in binary) 
'0000000100000000000000000000000110111000000000000000000100000010000000110000010000000101000001100000011100001000000010010000101000001011000011000000110100001110000011110001000000010001000100100001001100010100000101010001011000010111000110000001100100011010000110110001110000011101000111100001111100100000001000010010001000100011001001000010010100100110001001110010100000101001001010100010101100101100001011010010111000101111001100000011000100110010001100110011010000110101001101100010000000100001001000100010001100100100' 
7

Bạn có lẽ cần phương pháp .decode('hex') của chuỗi (Python 2. x).

data= ("01000001B8000102030405060708090A0B0C0D0E0F10111213141516" 
    "1718191A1B1C1D1E1F202122232425262728292A2B" 
    "2C2D2E2F303132333435362021222324") 
data.decode('hex') 

Nếu không, bạn có thể sử dụng base64.b16decode, nhưng bạn có thể muốn cung cấp một Đúng như tham số thứ hai (casefold) nếu đầu vào của bạn có chứa chữ thường hex chữ số A đến F.

1

Một cách dễ dàng để làm những gì bạn đang cố gắng làm ... chuyển đổi chuỗi của bạn thành một số thập phân hex sau đó sử dụng hàm bin tích hợp để chuyển đổi nó thành nhị phân.

dec_string = int(your_string, 16) #cast as int 

bin_string = bin(dec_string) #convert to binary 
Các vấn đề liên quan