Tôi đang cần một cách để lấy biểu diễn nhị phân của một chuỗi trong python. ví dụ
st = "hello world"
toBinary(st)
Có một mô-đun của một số cách làm việc này gọn gàng không?
ord
số thứ tự của mỗi ký tự trong (ví dụ: hex)?
Tôi đang cần một cách để lấy biểu diễn nhị phân của một chuỗi trong python. ví dụ
st = "hello world"
toBinary(st)
Có một mô-đun của một số cách làm việc này gọn gàng không?
ord
số thứ tự của mỗi ký tự trong (ví dụ: hex)?
Câu trả lời:
Một cái gì đó như thế này?
>>> st = "hello world"
>>> ' '.join(format(ord(x), 'b') for x in st)
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
#using `bytearray`
>>> ' '.join(format(x, 'b') for x in bytearray(st, 'utf-8'))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
' '.join('{0:08b}'.format(ord(x), 'b') for x in st)
, nhanh hơn khoảng 35% so với zfill(8)
giải pháp (ít nhất là trên máy của tôi).
β
, chẳng hạn như, đối với tôi, dường như được đại diện bởi 11001110 10110010
nội bộ?
Như một cách khó hiểu hơn, trước tiên bạn có thể chuyển đổi chuỗi của mình thành mảng byte sau đó sử dụng bin
hàm trong map
:
>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']
Hoặc bạn có thể tham gia:
>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Lưu ý rằng trong python3, bạn cần chỉ định mã hóa cho bytearray
hàm:
>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Bạn cũng có thể sử dụng binascii
mô-đun trong python 2:
>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
hexlify
trả về biểu diễn thập lục phân của dữ liệu nhị phân, sau đó bạn có thể chuyển đổi thành int bằng cách chỉ định 16 làm cơ sở của nó, sau đó chuyển nó thành nhị phân với bin
.
3.7.4
): (1) bytearray
mong đợi một mã hóa (không chỉ là một chuỗi) và (2) map(bin, ...)
sẽ trả về map
đối tượng. Về điểm đầu tiên, tôi sử dụng ví dụ bob
.encoding ('ascii') 'theo đề xuất của @Tao. Đối với điều thứ hai, hãy sử dụng join
phương thức, như trong các ví dụ khác của @Kasramvd sẽ hiển thị kết quả mong muốn.
Chúng ta chỉ cần mã hóa nó.
'string'.encode('ascii')
v3.7.4
), điều này trả về một bytes
đối tượng (với các biểu diễn ascii của mỗi byte, nếu có) và để hiển thị biểu diễn nhị phân của nó, tôi cần bin
, ví dụ: với ' '.join(item[2:] for item in map(bin, 'bob'.encode('ascii')))
(lưu ý rằng 0b
cần được xóa ở đầu biểu diễn nhị phân của mỗi nhân vật).
Bạn có thể truy cập các giá trị mã cho các ký tự trong chuỗi của mình bằng cách sử dụng ord()
hàm tích hợp. Nếu sau đó bạn cần định dạng nó ở dạng nhị phân, string.format()
phương thức sẽ thực hiện công việc.
a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
(Cảm ơn Ashwini Chaudhary đã đăng đoạn mã đó.)
Mặc dù mã trên hoạt động trong Python 3, nhưng vấn đề này sẽ phức tạp hơn nếu bạn giả sử bất kỳ mã hóa nào khác ngoài UTF-8. Trong Python 2, chuỗi là chuỗi byte và mã hóa ASCII được giả định theo mặc định. Trong Python 3, các chuỗi được giả định là Unicode và có mộtbytes
loại hoạt động giống chuỗi Python 2 hơn. Nếu bạn muốn giả sử bất kỳ mã hóa nào khác ngoài UTF-8, bạn sẽ cần chỉ định mã hóa.
Trong Python 3, sau đó, bạn có thể làm như sau:
a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))
Sự khác biệt giữa mã hóa UTF-8 và ascii sẽ không rõ ràng đối với các chuỗi chữ và số đơn giản, nhưng sẽ trở nên quan trọng nếu bạn đang xử lý văn bản bao gồm các ký tự không có trong bộ ký tự ascii.
Trong phiên bản Python 3.6 trở lên, bạn có thể sử dụng f-string để định dạng kết quả.
str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))
01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
Phía bên trái của dấu hai chấm, ord (i), là đối tượng thực tế có giá trị sẽ được định dạng và chèn vào đầu ra. Sử dụng ord () cung cấp cho bạn điểm mã cơ sở 10 cho một ký tự str.
Phía bên phải của dấu hai chấm là ký hiệu định dạng. 08 có nghĩa là chiều rộng 8, 0 được đệm và b có chức năng như một dấu hiệu để xuất ra số kết quả trong cơ số 2 (nhị phân).
Đây là bản cập nhật cho các câu trả lời hiện có đã được sử dụng bytearray()
và không thể hoạt động theo cách đó nữa:
>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
Bởi vì, như đã giải thích trong liên kết ở trên, nếu nguồn là một chuỗi, bạn cũng phải cung cấp mã hóa :
>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>
def method_a(sample_string):
binary = ' '.join(format(ord(x), 'b') for x in sample_string)
def method_b(sample_string):
binary = ' '.join(map(bin,bytearray(sample_string,encoding='utf-8')))
if __name__ == '__main__':
from timeit import timeit
sample_string = 'Convert this ascii strong to binary.'
print(
timeit(f'method_a("{sample_string}")',setup='from __main__ import method_a'),
timeit(f'method_b("{sample_string}")',setup='from __main__ import method_b')
)
# 9.564299999998184 2.943955828988692
method_b về cơ bản hiệu quả hơn trong việc chuyển đổi thành mảng byte vì nó thực hiện các lệnh gọi hàm mức thấp thay vì chuyển đổi thủ công mọi ký tự thành số nguyên, sau đó chuyển đổi số nguyên đó thành giá trị nhị phân của nó.
a = list(input("Enter a string\t: "))
def fun(a):
c =' '.join(['0'*(8-len(bin(ord(i))[2:]))+(bin(ord(i))[2:]) for i in a])
return c
print(fun(a))