端序(又稱字節序),是一種很數據結構的東西嗯0.0
最近在做二進制文件解包,發現文件頭上的分配表是用大端序的。
還是python方便,一開始用的是這樣的:
1 |
struct.unpack('>%1s2x3I' ,dt) |
這樣解包出來的結果中定位信息是類似0xFA2D3412這樣子的大端序。而我們需要的是0x12342DAF這樣的小端序,即每兩位為一個單位逆轉。
試來試去寫了很自虐的代碼,感覺自己在寫C++,果斷google一下,然後發現了這個http://bbs.chinaunix.net/thread-4067369-1-1.html
帖子里是要先進制轉換,這個我們不需要,直接略過:
1 |
hex(i)[2::].decode('hex')[::-1].encode('hex') |
其實是做了三件事情
- 把十進制轉成十六進制,使用hex();得到的是字符串,把開頭的0x切掉並倒轉。假設這一步得到的2143D2AF
- 使用字符串解碼deocde,按十六進制解碼,得到的是一個字符串‘!C\xd2\xaf’,然後對它進行倒轉,得到‘\xaf\xd2C!’
- 使用字符串編碼encode,編碼成十六進制,得到目標結果afd24321
為什麼直接倒轉一次就搞定了這麼神奇呢?
因為第二步中經過解碼後得到的東西就是把十六進制串兩個兩個地合起來了,然後倒轉,編碼即可。
當然,對於python的unpack 的話,直接把模式串改成'<%1s2x3I’就好了。因為開頭的<就是表示小端序,>表示大端序
為什麼都搞python…..
寫起來爽ω
…想太多,直接binary to struct搞定了
探討一下實現嘛www
字符串類有個reverse方法(好吧其實大多數迭代器都有reverse方法),相比之下[::-1]就顯得丑多了……
我不是很懂,你是說reversed()?
對(之前寫錯了)我覺得這個比[::-1]優雅。。。
好好好[思考]