2013-04-08 39 views
12

hãy xem này:Python, in Hex xóa 0 đầu tiên?

fc = '0x' 
for i in b[0x15c:0x15f]: 
    fc += hex(ord(i))[2:] 

phép nói rằng mã này tìm thấy hex 00 04 0f, thay vì viết nó như vậy, nó loại bỏ các 0 đầu tiên, và viết: 04f bất kỳ sự giúp đỡ?

Trả lời

21

này đang xảy ra vì hex() sẽ không bao gồm bất kỳ số không hàng đầu, ví dụ:

>>> hex(15)[2:] 
'f' 

Để đảm bảo bạn luôn có được hai ký tự, bạn có thể sử dụng str.zfill() để thêm số 0 đứng đầu khi cần:

>>> hex(15)[2:].zfill(2) 
'0f' 

Đây là wha t nó sẽ trông như thế nào trong mã của bạn:

fc = '0x' 
for i in b[0x15c:0x15f]: 
    fc += hex(ord(i))[2:].zfill(2) 
+0

'cho i trong b [0x15c: 0x15f]: \t \t h = hex (ord (i)) [2:] \t \t nếu len (h) = 2: h = '0' + h \t \t fc + = h; ' Một người bạn đã nói điều này sẽ hoạt động – thethiny

+0

Cuối cùng, một ví dụ đã được giải thích đúng về cách thi s! – monojohnny

+0

Tôi sẽ không nói nó giải thích đúng và tôi không phải là tốt nhất để giải thích. Nó bỏ qua các số 0 ở đầu vì chúng không có ý nghĩa gì đối với giá trị thập phân của các giá trị hex. Chúng biểu thị số byte mà các giá trị chiếm. 15 = f. 0f = 15 bởi vì 0 + 15 là 15 –

2
print ["0x%02x"%ord(i) for i in b[0x15c:0x15f]] 

sử dụng một chuỗi định dạng "%2x" nói với nó để định dạng nó là 2 ký tự rộng, tương tự như vậy "%02x" nói với nó để pad với 0 của

lưu ý rằng điều này vẫn sẽ loại bỏ số 0 đầu từ việc với hơn 2 giá trị hex ví dụ: "0x%02x"%0x0055 => "0x55"

0

Nó vẫn chỉ là một biểu diễn đồ họa để thuận tiện cho bạn.
Giá trị không thực sự bị tước khỏi dữ liệu, nó chỉ được rút ngắn trực quan.

Mô tả đầy đủ ở đây và tại sao nó lại hay tại sao nó không quan trọng: Why are hexadecimal numbers prefixed with 0x?

+1

không, nó được tước từ các dữ liệu, tôi đã cố gắng in ra, và nó mang lại giá trị khác nhau, 04f là cách quá nhiều khác biệt so với 00040f – thethiny

11
>>> map("{:02x}".format, (10, 13, 15)) 
['0a', '0d', '0f'] 
+3

Đây là waaaaay thêm pythonic hơn câu trả lời upvoted nhất! +1! – Antonvh

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