在十六进制字符串重新排序字节顺序(蟒)(reorder byte order in hex stri

2019-07-03 11:03发布

我想建立一个Python小格式化给我回来嵌在十六进制字符串的行数值。

这是我的格式化器的一个中央部分和应该是合理的快速格式化超过100行/秒(每行约100〜字符)。

下面的代码应该给地方我目前受阻的例子。

“data_string_in_orig”示出给定的输入格式。 它为每个字被字节交换。 需要从“data_string_in_orig”到“data_string_in_swapped”掉。 最后,我所需要的结构的访问,如图所示。 预期的结果是在注释中。

在此先感谢沃尔夫冈 - [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)

Answer 1:

array.arrays有一个字节交换的方法 :

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)

harray.array('h', x)选择,因为它告诉array.array都把数据在x为2个字节的短裤的阵列。 重要的是,每一个项目被视为2字节长。 H ,这意味着2个字节的无符号短,效果一样好。



Answer 2:

这应该怎么做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)

基本上,解包6个短裤大端,重新打包为6个短裤小端。

同样,相同的事情,unutbu的代码呢,你应该使用他。

编辑刚刚意识到我可以用我最喜欢的Python的成语这个......别这样做可以:

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


Answer 3:

import binascii, tkinter, array
from tkinter import *

infile_read = filedialog.askopenfilename()

with open(infile, 'rb') as infile_:
    infile_read = infile_.read()

x = (infile_read)
y = array.array('l', x)
y.byteswap()
swapped = (binascii.hexlify(y))

这是一个32位无符号短掉我用代码实现大同小异的“unutbu的”答案只是一点点,更容易理解。 而技术上binascii不需要用于交换。 仅需要array.byteswap。



Answer 4:

从“data_string_in_orig”到“data_string_in_swapped”的交换也可以与内涵做到不使用任何进口:

>>> d = 'b62e000052e366667a66408d'
>>> "".join([m[2:4]+m[0:2] for m in [d[i:i+4] for i in range(0,len(d),4)]])
'2eb60000e3526666667a8d40'

修真适用于在代表16位字十六进制字符串交换字节顺序。 修改它不同的字长是微不足道的。 我们可以做一个普通十六进制数字顺序交换功能也:

def swap_order(d, wsz=4, gsz=2 ):
    return "".join(["".join([m[i:i+gsz] for i in range(wsz-gsz,-gsz,-gsz)]) for m in [d[i:i+wsz] for i in range(0,len(d),wsz)]])

输入PARAMS如下:

d:输入十六进制字符串

WSZ:字大小在半字节(例如,用于16位字WSZ = 4,对于32位字WSZ = 8)

GSZ:其中呆在一起半字节的数目(例如,用于重新排序字节GSZ = 2,用于重新排序的16位字GSZ = 4)



文章来源: reorder byte order in hex string (python)