2013-04-08 13 views

Odpowiedz

21

Dzieje się tak dlatego, hex() nie będzie zawierać żadnych zer, na przykład:

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

Aby upewnić się zawsze dwa znaki, można użyć str.zfill() dodać zerem gdy jest to konieczne:

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

Oto wha t to będzie wyglądać w kodzie:

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

'dla I, b [0x15c: 0x15f] \t \t H = sześciokątną (ORD (I)) [2:] \t \t jeśli len (H) = 2: h = '0' + H \t \t FC + = h; ' Znajomy powiedział, że to zadziała – thethiny

+0

Nareszcie właściwie objaśniony działający przykład na thi s! – monojohnny

+0

Nie powiedziałbym, że jest odpowiednio wyjaśniony i nie jestem najlepszy do wyjaśnienia. Ignoruje początkowe zera, ponieważ nie mają one nic wspólnego z wartością dziesiętną wartości szesnastkowych. Wskazują liczbę bajtów, które wartości przyjmują. 15 = f. 0f = 15, ponieważ 0 + 15 to 15 –

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

użycie ciąg formatu "%2x" informuje go, aby go sformatować za 2 znaki szerokie, podobnie "%02x" informuje go do podkładki z 0 za

pamiętać, że będzie to jeszcze usunąć wiodącym 0 na od rzeczy z więcej niż 2 wartości szesnastkowe: np .: "0x%02x"%0x0055 => "0x55"

0

To wciąż tylko graficzne przedstawienie dla Twojej wygody.
Wartość nie jest faktycznie usunięta z danych, jest tylko wizualnie skrócona.

Pełny opis tutaj i dlaczego to jest i dlaczego to nie jest ważne: Why are hexadecimal numbers prefixed with 0x?

+1

nie, to jest usuwany z danymi, próbowałem drukowania wyjście, a to daje różne wartości, 04F jest zbyt dużo inny niż 00040f – thethiny

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

To jest bardziej pythonic niż najbardziej upvoted odpowiedź! +1! – Antonvh