首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中将8位列表转换为32位整数数组

在python中将8位列表转换为32位整数数组
EN

Stack Overflow用户
提问于 2018-07-05 06:00:17
回答 3查看 3.1K关注 0票数 0

我所拥有的:

代码语言:javascript
复制
textdata = "this is my test data"
DataArray = [ord(c) for c in textdata]

现在,我想通过将列表中的4个元素组合在一起,将其转换为x32位整数

例如: DataArray0:4将变成一个32位整数,然后迭代到接下来的4个元素并执行相同的操作。最后,我会得到一个包含所有结果的32位数组。

我如何在python中通过白化遍历整个字符串来做到这一点呢?有没有简单的方法可以做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-05 06:15:34

使用numpy:

代码语言:javascript
复制
>>> import numpy as np

>>> a = np.frombuffer(b'this is my test data', dtype=np.int32)
>>> a
array([1936287860,  544434464, 1948285293,  544502629, 1635017060], dtype=int32)
>>> a.tobytes()
b'this is my test data'

对于可以在机器之间移植的字节顺序,可以使用'<i4'或类似的dtype。

我假设您可以将初始数据保存为bytes而不是unicode,因为您确实应该努力做到这一点。

票数 1
EN

Stack Overflow用户

发布于 2018-07-05 06:17:25

您可以使用struct内置的python模块:

代码语言:javascript
复制
from struct import unpack

textdata = "this is my test data"
data = list(unpack('i'*(len(textdata)//4), textdata))

结果:

代码语言:javascript
复制
[1936287860, 544434464, 1948285293, 544502629, 1635017060]

例如,如果您想使用无符号整数,则不需要遍历字符串,并且可以找到其他Format Characters

票数 1
EN

Stack Overflow用户

发布于 2018-07-05 06:13:30

您可以使用如下代码,它使用位操作(big-endian):

代码语言:javascript
复制
def chunk2int(chunk):
    """ Converts a chunk (string) into an int, 8 bits per character """
    val = 0
    for c in chunk:
        val = (val << 8) | (ord(c) & 0xFF)
    return val

def int2chunk(val):
    """ Converts an int into a chunk, consuming 8 bits per character """
    rchunk = []
    while val:
        rchunk.append(val & 0xFF)
        val >>= 8

    return ''.join(chr(c) for c in reversed(rchunk))

textdata = "this is my test data"

chunks = [textdata[i:i + 4] for i in range(0, len(textdata), 4)]
print(chunks)

data = [chunk2int(c) for c in chunks]
print(data)

chunks = [int2chunk(d) for d in data]
print(chunks)

产生:

代码语言:javascript
复制
['this', ' is ', 'my t', 'est ', 'data']
[1952999795, 543781664, 1836654708, 1702065184, 1684108385]
['this', ' is ', 'my t', 'est ', 'data']

如果您在输入文本中使用带有1 <= ord(c) <= 255的字符,这将会起作用。如果字符串中有空字节,int2chunk方法可能会提前终止,在这种情况下,您必须填充这些块。

还有struct模块,它可能值得研究一下,您可以在其中更简单地更改字节顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51181193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档