【问题标题】:Python) Convert Big Endian to Little EndianPython) 将 Big Endian 转换为 Little Endian
【发布时间】:2022-06-10 17:39:22
【问题描述】:

我有一个文件 (.vcon),其中包含存储在 big endian 中的十六进制字符串(大约 2,000 字节),我想根据规则集将此文件转换为 little endian 十六进制字符串 .vcon 文件。

在一个列表中,有四个可能的值:8、16、32、64 如果列表中的数字是 8,则不需要切换(从大端到小端),因为数据是一个字节。 除 8 以外,数据必须从大端切换到小端。

我想不出办法解决这个问题。

比如我的.vcon文件(大端)中的数据如下

F324658951425AF3EB0011

列表中的数字如下

[16, 8, 8, 32, 8, 16] 

那么我们创建的结果数据应该如下(小端)

24F36589F35A4251EB1100

我应该如何遍历列表中的数字,同时访问十六进制字符串文件(即大端格式)中的每个字节,并以小端格式创建一个新的十六进制字符串文件?

【问题讨论】:

  • 字符串F324658951425AF3EB0011(长度=22)如何转换为[16, 8, 8, 32, 8, 16](6个数字)?
  • @Anentropic 这些数字是位(他们说 8 表示一个字节)。把它们加起来,你得到 11 个字节。这是 22 个十六进制数字。

标签: python hex endianness


【解决方案1】:

这是一个简单但有效的方法:

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)

输出:

24F36589F35A4251EB1100

【讨论】:

    【解决方案2】:

    概括地说,

    >>> data = "F324658951425AF3EB0011"
    >>> bits = [16, 8, 8, 32, 8, 16]
    

    我会首先获取单个字节大小(即两个十六进制字符)的片段:

    >>> bs = [data[i:i+2] for i in range(0, len(data), 2)] # get individual bytes
    >>> bs
    ['F3', '24', '65', '89', '51', '42', '5A', 'F3', 'EB', '00', '11']
    

    然后,我将使用迭代器根据位列表中的值获取多个字节(每 8 位一个字节),然后以相反的顺序将此字符串块添加到列表中。然后在最后加入:

    >>> iterator = iter(bs)
    >>> result = []
    >>> for n in bits:
    ...     chunk = [next(iterator) for _ in range(n//8)]
    ...     result.extend(reversed(chunk))
    ...
    >>> print("".join(result))
    24F36589F35A4251EB1100
    

    【讨论】:

      【解决方案3】:

      我可能会遍历您的 rule 列表(您的 [16, 8, 8, 32, 8, 16])。对于rule 中的每个元素,从.vcon 中取出rule[i]/8 touples,并将这些touples 以相反的顺序添加到您的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)
      

      【讨论】:

        【解决方案4】:

        使用字节数组:

        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())
        

        Try it online!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-09
          • 2020-12-01
          • 2019-06-30
          • 2018-10-23
          • 1970-01-01
          • 2018-05-15
          • 2017-08-26
          相关资源
          最近更新 更多