如何在python中将字符串中的32位整数字节换掉?

时间:2013-06-04 05:22:56

标签: python

我有一个超过256位的大字符串,我需要将其字节交换32位。但是字符串是十六进制的。当我查看numpy和数组模块时,我无法找到关于如何进行转换的正确语法。有人可以帮助我吗?

一个例子:(认为数据更长。我可以使用包但是我必须将小端转换为十进制,然后再转换为大端,这似乎是浪费):

Input:12345678abcdeafa
Output:78563412faeacdab

3 个答案:

答案 0 :(得分:3)

如果它们确实是字符串,只需对它们进行字符串操作吗?

>>> input = "12345678abcdeafa"
>>> input[7::-1]+input[:7:-1]
'87654321afaedcba'

答案 1 :(得分:3)

将字符串转换为字节,解压缩big-endian 32位并打包小端32位(反之亦然)并转换回字符串:

#!python3
import binascii
import struct

Input = b'12345678abcdeafa'
Output = b'78563412faeacdab'

def convert(s):
    s = binascii.unhexlify(s)
    a,b = struct.unpack('>LL',s)
    s = struct.pack('<LL',a,b)
    return binascii.hexlify(s)

print(convert(Input),Output)

输出:

b'78563412faeacdab' b'78563412faeacdab'

对长度倍数为4的任何字符串进行广义化:

import binascii
import struct

Input = b'12345678abcdeafa'
Output = b'78563412faeacdab'

def convert(s):
    if len(s) % 4 != 0:
        raise ValueError('string length not multiple of 4')
    s = binascii.unhexlify(s)
    f = '{}L'.format(len(s)//4)
    dw = struct.unpack('>'+f,s)
    s = struct.pack('<'+f,*dw)
    return binascii.hexlify(s)

print(convert(Input),Output)

答案 2 :(得分:2)

我的看法:

  1. 将字符串切成N个数字块
  2. 反转每个块
  3. 连接所有内容
  4. 示例:

    >>> source = '12345678abcdeafa87654321afaedcba'
    >>> # small helper to slice the input in 8 digit chunks
    >>> chunks = lambda iterable, sz: [iterable[i:i+sz] 
                                       for i in range(0, len(iterable), sz)]
    >>> swap = lambda source, sz: ''.join([chunk[::-1] 
                                           for chunk in chunks(source, sz)])
    

    原始问题中提出的输出:

    >>> swap(source, 8)
    '87654321afaedcba12345678abcdeafa'
    

    在icktoofay编辑后,很容易适应以匹配所需的输出:

    >>> swap(swap(source, 8), 2)
    '78563412faeacdab21436587badcaeaf'
    

    正确的实施可能应该检查len(source) % 8 == 0