端序(又称字节序),是一种很数据结构的东西嗯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]优雅。。。
好好好[思考]