以十六进制字符串(python)重新排序字节顺序

Wol*_* R. 8 python string hex swap python-2.x

我想在python中构建一个小格式化器,让我回到嵌入在十六进制字符串行中的数值.

它是格式化程序的核心部分,格式化速度超过100行/秒(每行大约约100个字符)应该是合理的.

下面的代码应该给出一个我目前被阻止的例子.

'data_string_in_orig'显示给定的输入格式.它必须为每个字进行字节交换.需要从'data_string_in_orig'到'data_string_in_swapped'的交换.最后,我需要结构访问,如图所示.预期结果在评论中.

在此先感谢Wolfgang R.

#!/usr/bin/python

import binascii
import struct

## 'uint32 double'
data_string_in_orig    = 'b62e000052e366667a66408d'
data_string_in_swapped = '2eb60000e3526666667a8d40'
print data_string_in_orig

packed_data = binascii.unhexlify(data_string_in_swapped)
s = struct.Struct('<Id')
unpacked_data = s.unpack_from(packed_data, 0)  
print 'Unpacked Values:', unpacked_data

## Unpacked Values: (46638, 943.29999999943209)

exit(0)
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 14

array.arrays有一个byteswap方法:

import binascii
import struct
import array
x = binascii.unhexlify('b62e000052e366667a66408d')
y = array.array('h', x)  
y.byteswap()
s = struct.Struct('<Id')
print(s.unpack_from(y))

# (46638, 943.2999999994321)
Run Code Online (Sandbox Code Playgroud)

harray.array('h', x)被选择,因为它告诉array.array都把数据x作为2字节短裤的阵列.重要的是每个项目被视为2字节长.H,表示2字节无符号短路,也可以正常工作.


Tri*_*ych 7

这应该与unutbu的版本完全相同,但对某些人来说可能稍微容易一些......

from binascii import unhexlify
from struct import pack, unpack
orig = unhexlify('b62e000052e366667a66408d')
swapped = pack('<6h', *unpack('>6h', orig))
print unpack('<Id', swapped)

# (46638, 943.2999999994321)
Run Code Online (Sandbox Code Playgroud)

基本上,打开6短裤big-endian,重新打包为6短裤小端.

同样,unutbu的代码也是如此,你应该使用他的.

编辑刚刚意识到我会使用我最喜欢的Python成语...不要这样做:

orig = 'b62e000052e366667a66408d'
swap =''.join(sum([(c,d,a,b) for a,b,c,d in zip(*[iter(orig)]*4)], ()))
# '2eb60000e3526666667a8d40'
Run Code Online (Sandbox Code Playgroud)