端序(又称字节序),是一种很数据结构的东西嗯0.0
最近在做二进制文件解包,发现文件头上的分配表是用大端序的。
还是python方便,一开始用的是这样的:
这样解包出来的结果中定位信息是类似0xFA2D3412这样子的大端序。而我们需要的是0x12342DAF这样的小端序,即每两位为一个单位逆转。
试来试去写了很自虐的代码,感觉自己在写C++,果断google一下,然后发现了这个http://bbs.chinaunix.net/thread-4067369-1-1.html
帖子里是要先进制转换,这个我们不需要,直接略过:
其实是做了三件事情
- 把十进制转成十六进制,使用hex();得到的是字符串,把开头的0x切掉并倒转。假设这一步得到的2143D2AF
- 使用字符串解码deocde,按十六进制解码,得到的是一个字符串‘!C\xd2\xaf’,然后对它进行倒转,得到‘\xaf\xd2C!’
- 使用字符串编码encode,编码成十六进制,得到目标结果afd24321
为什么直接倒转一次就搞定了这么神奇呢?
因为第二步中经过解码后得到的东西就是把十六进制串两个两个地合起来了,然后倒转,编码即可。
当然,对于python的unpack 的话,直接把模式串改成'<%1s2x3I’就好了。因为开头的<就是表示小端序,>表示大端序
tips: 以下代码可以在python2.7时可以执行,在python3执行的时候,会报错:
AttributeError: 'str' object has no attribute 'decode'
还有这个示例:
"6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000".decode('hex')[::-1].encode('hex_codec') #=> 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
python3我是这么转的,有些复杂,有更好的可以提出来
import codecs
codecs.encode(codecs.decode("6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000",'hex')[::-1],'hex_codec')