我所拥有的:
textdata = "this is my test data"
DataArray = [ord(c) for c in textdata]
现在,我想通过将列表中的4个元素组合在一起,将其转换为x32位整数
例如: DataArray0:4将变成一个32位整数,然后迭代到接下来的4个元素并执行相同的操作。最后,我会得到一个包含所有结果的32位数组。
我如何在python中通过白化遍历整个字符串来做到这一点呢?有没有简单的方法可以做到这一点?
发布于 2018-07-05 06:15:34
使用numpy:
>>> 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
,因为您确实应该努力做到这一点。
发布于 2018-07-05 06:17:25
您可以使用struct内置的python模块:
from struct import unpack
textdata = "this is my test data"
data = list(unpack('i'*(len(textdata)//4), textdata))
结果:
[1936287860, 544434464, 1948285293, 544502629, 1635017060]
例如,如果您想使用无符号整数,则不需要遍历字符串,并且可以找到其他Format Characters。
发布于 2018-07-05 06:13:30
您可以使用如下代码,它使用位操作(big-endian):
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)
产生:
['this', ' is ', 'my t', 'est ', 'data']
[1952999795, 543781664, 1836654708, 1702065184, 1684108385]
['this', ' is ', 'my t', 'est ', 'data']
如果您在输入文本中使用带有1 <= ord(c) <= 255
的字符,这将会起作用。如果字符串中有空字节,int2chunk
方法可能会提前终止,在这种情况下,您必须填充这些块。
还有struct模块,它可能值得研究一下,您可以在其中更简单地更改字节顺序。
https://stackoverflow.com/questions/51181193
复制相似问题