2010-12-20 51 views
20

Làm cách nào để chuyển đổi chuỗi thành giá trị byte của nó? Tôi có một chuỗi "hello" và tôi muốn thay đổi thành một cái gì đó như "/x68...".Làm thế nào để chuyển đổi chuỗi thành mảng byte?

+2

Bạn nhận ra rằng đó là tất cả chỉ bit và byte tại mức thấp nhất và các chuỗi '" hello "' và '" \ x68 \ x65 \ x6C \ x6C \ x6F "' giống hệt nhau (trừ khi bạn thoát khỏi các dấu gạch chéo ngược thay vì sử dụng chúng để thoát hex)? – delnan

+0

Vâng tôi biết. Tôi chỉ muốn xuất khẩu vào một số mảng ở mức độ thấp như vậy. – Martin

+1

Điều này không có ý nghĩa gì, bạn muốn _actually_ muốn làm gì? (Đây chỉ là một số bước trung gian bạn nghĩ bạn cần làm) – plundra

Trả lời

31

Python 2.6 trở lên có loại bytearray có thể là thứ bạn đang tìm kiếm. Không giống như các chuỗi, nó có thể thay đổi, tức là, bạn có thể thay đổi các byte riêng lẻ "tại chỗ" thay vì phải tạo một chuỗi hoàn toàn mới. Nó có một kết hợp tốt đẹp của các tính năng của danh sách và chuỗi. Và nó cũng làm cho ý định của bạn rõ ràng, rằng bạn đang làm việc với các byte tùy ý thay vì văn bản.

+1

quote "Tôi muốn thay đổi tất cả những gì trong tập tin (String) thành mảng byte." .. @ kindall của câu trả lời thực hiện chính xác điều đó. 1 cho bytearray() – easysid

+8

'list (bytearray (" hello "))' –

+5

Tôi đã thực hiện kiểm tra tốc độ và 'list (bytearray (" hello "))' nhanh hơn 'map (ord," hello ")' –

12

Nếu bạn muốn để có được đại diện chuỗi thập lục phân bạn có thể làm:

"hello".encode("hex") # '68656c6c6f' 

Và để đáp ứng trình bày tài liệu tham khảo của bạn (đừng mang nó nghiêm túc, đoán đây là không phải những gì bạn thực sự muốn) :

"".join(["/x%02x" % ord(c) for c in "hello"]) # '/x68/x65/x6c/x6c/x6f' 
27

Có lẽ bạn muốn điều này (Python 2):

Đối với một chuỗi Unicode này sẽ quay trở lại mã Unicode điểm:

>>> map(ord,u'Hello, 马克') 
[72, 101, 108, 108, 111, 44, 32, 39532, 20811] 

Nhưng mã hóa nó để có được giá trị byte cho mã hóa:

>>> map(ord,u'Hello, 马克'.encode('chinese')) 
[72, 101, 108, 108, 111, 44, 32, 194, 237, 191, 203] 
>>> map(ord,u'Hello, 马克'.encode('utf8')) 
[72, 101, 108, 108, 111, 44, 32, 233, 169, 172, 229, 133, 139] 
+0

Lưu ý rằng điều này sẽ không trả về các giá trị "byte" cho các ký tự không phải ASCII, bởi vì thứ tự sẽ trả về một cái gì đó lớn hơn 0xFF. – user100464

+0

@ user100464, không phải cho chuỗi byte, mà ở trên là dành cho Python 2 ('map' không trả về một danh sách trong Python 3). Một byte không được cao hơn 0xFF. Ngoài ra, không phải ASCII ở trên 0x7F, không phải 0xFF :) –

Các vấn đề liên quan