我有一个包含十六进制字符串(约2,000个字节)的文件( .vcon )存储在大端点中,并希望根据规则集将该文件转换为小endian十六进制字符串.vcon文件。
在一个列表中,有四个可能的值: 8,16,32,64,如果一个列表中的数字是8,那么就不需要滑动(从大到小的endian),因为数据是一个字节。除了8,数据必须从大到小的终端。
我想不出办法来解决这个问题。
例如,如果我在.vcon文件(大端)中的数据如下所示
F324658951425AF3EB0011名单中的数字如下
[16, 8, 8, 32, 8, 16] 那么,我们创建的结果数据应该如下所示(对于小endian)
24F36589F35A4251EB1100如何迭代列表中的数字,同时访问十六进制字符串文件(即大端格式)中的每个字节,并以小endian格式创建新的十六进制字符串文件?
发布于 2022-06-10 09:39:22
使用字节数组(在网上试试!):
data = "F324658951425AF3EB0011"
bits = [16, 8, 8, 32, 8, 16]
b = bytearray.fromhex(data)
i = 0
for n in bits:
n //= 8
b[i:i+n] = reversed(b[i:i+n])
i += n
print(b.hex().upper())或者使用内存视图(在网上试试!):
data = "F324658951425AF3EB0011"
bits = [16, 8, 8, 32, 8, 16]
b = bytearray.fromhex(data)
m = memoryview(b)
for n in bits:
n //= 8
m[:n] = m[n-1::-1]
m = m[n:]
print(b.hex().upper())发布于 2022-06-10 09:10:46
我可能会循环您的rule列表(您的16,8,8,32,8,16)。对于rule中的每个元素,从.vcon中提取rule[i]/8参数,并将这些参数按相反顺序添加到result中。
就像这样:
rule = [16, 8, 8, 32, 8, 16]
bigE = 'F324658951425AF3EB0011'
littleE = ''
for x in rule:
n = x//4
word, bigE = bigE[:n], bigE[n:]
for i in range(x//8):
word, byte = word[:-2], word[-2:]
littleE += byte
print(littleE)发布于 2022-06-10 09:13:15
以下是一种简单但有效的方法:
hs = 'F324658951425AF3EB0011'
m = [16, 8, 8, 32, 8, 16]
idx = 0
result = ''
for w in m:
match w:
case 8:
result += hs[idx:idx+2]
case 16:
result += hs[idx+2:idx+4] + hs[idx:idx+2]
case 32:
result += hs[idx+6:idx+8] + hs[idx+4:idx+6] + hs[idx+2:idx+4] + hs[idx:idx+2]
idx += w // 4
print(result)输出:
24F36589F35A4251EB1100https://stackoverflow.com/questions/72571540
复制相似问题