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

以十六进制字符串(python)对字节顺序进行重新排序,python,string,hex,swap,python-2.x,Python,String,Hex,Swap,Python 2.x,我想用python构建一个小的格式化程序,返回数值 嵌入在十六进制字符串行中的值 它是我的格式化程序的一个核心部分,应该可以合理地快速执行 格式化速度超过100行/秒(每行约100个字符) 下面的代码应该给出一个我当前被阻止的示例 “原始数据中的数据字符串”显示给定的输入格式。一定是这样 每个字的字节交换。从“原始数据中的数据字符串”到 需要“数据字符串交换中的数据字符串”。最后我需要这个结构 访问权限如图所示。预期结果在注释中 提前谢谢 沃尔夫冈R #!/usr/bin/python imp

我想用python构建一个小的格式化程序,返回数值 嵌入在十六进制字符串行中的值

它是我的格式化程序的一个核心部分,应该可以合理地快速执行 格式化速度超过100行/秒(每行约100个字符)

下面的代码应该给出一个我当前被阻止的示例

“原始数据中的数据字符串”显示给定的输入格式。一定是这样 每个字的字节交换。从“原始数据中的数据字符串”到 需要“数据字符串交换中的数据字符串”。最后我需要这个结构 访问权限如图所示。预期结果在注释中

提前谢谢 沃尔夫冈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)
#/usr/bin/python
导入binascii
导入结构
##‘uint32双’
原始格式中的数据字符串='b62e000052e366667a66408d'
交换中的数据字符串='2eb60000e3526666667a8d40'
打印原始格式中的数据\u字符串\u
压缩数据=binascii.unhexlify(数据字符串在交换中)

s=struct.struct('
array.array
具有:

导入binascii
导入结构
导入数组
x=binascii.unexlify('b62e000052e366667a66408d')
y=数组。数组('h',x)
y、 byteswap()

s=struct.struct(“这应该和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)

这是一个32位无符号短交换,我用与“unutbu”非常相似的代码实现回答稍微容易理解一点。从技术上讲,交换不需要binascii。只需要array.byteswap。

从“原始数据中的数据字符串”到“已交换数据中的数据字符串”的交换也可以在不使用任何导入的情况下通过理解完成:

>>> 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)]])
输入参数为:

d:输入十六进制字符串

wsz:半字节中的字大小(例如,对于16位字wsz=4,对于32位字wsz=8)


gsz:保持在一起的半字节数(例如,对于重新排序字节gsz=2,对于重新排序16位字gsz=4)

array.byteswap
.Sweet.我想我会继续,不会发布我做的笨拙的解包big-endian/repack-little-endian解决方案…继续发布吧!有多种方法可以解决问题。谢谢,这对我来说既快又完美。顺便说一句,5秒内10万行。@wolfgang.-如果这个解决方案对你有效,你应该接受答案。
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))
>>> 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'
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)]])