如何使用Python以特定顺序打包

时间:2015-11-25 10:45:56

标签: python endianness pack

我想将0x12345678打包到\x34\x12\x78\x56

我写了这个

>>> a = struct.unpack('cccc', struct.pack('I', 0x12345678))
>>> struct.pack('cccc', [a[i] for i in (1,0,3,2)])

但它非常难看。有没有更简单的方法呢?

2 个答案:

答案 0 :(得分:1)

修改:正确的方法:使用short并反转endian类型

newString = filter(lambda char: char.isdigit(), oldString)

旧答案
你可以改变用法......

import struct
a = struct.unpack('hh', struct.pack('I', 0x12345678))
struct.pack('>hh', *a)

但是它制造了很多变量

或者,在数组中交换将使您更容易传递结果:

import struct
a1, a0, a3, a2 = struct.unpack('cccc', struct.pack('I', 0x12345678))
struct.pack('cccc', a0, a1, a2, a3)

注意:他们可能是更好的交换方式:)

答案 1 :(得分:1)

一种方法是将它分成短片然后重新组合,虽然它几乎同样丑陋:

def pack(x):
    return struct.pack('<hh', x >> 16, x & 0xffff)

>>> pack(0x12345678).encode('hex')
'34127856'

据我所知,Python中没有对混合字节序的开箱即用支持。