将十六进制值的行转换为二进制,按列垂直排列

2024-05-13 14:38:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理来自串行设备的数据,它以非常有趣的格式输出数据。该设备有256x256像素阵列,而每个像素有一个14位值,用移位寄存器读出。在

为了显示格式,我将按照每个像素是否有一个6位值的方式进行说明:

                             'Pixel #'
        0-8   9-16   17-24  25-32  33-40  41-48  48-56  57-64 ... 256
        --------------------------------------------------------------
    0   255    255    255    255    255    255    255    255  ...
    1   127    255    255    255    255    255    255    255  ...
    2   255    255    255    255    255    255    255    255  ...
    3   255    255    255    255    255    255    255    255  ...
    4   255    255    255    255    255    255    255    255  ...
    5   255    255    255    255    255    255    255    255  ...

    Note that the 2nd row starts with a value of 127

要获得第一个像素(像素0)的6位值,必须执行以下操作:

  1. 行中的每个值都需要视为其二进制/位等效值
  2. 垂直读取,从每行向下6行对齐的位(对于a6位输出值),得到该像素的值

即:

^{pr2}$

现在,在所有256列中重复该操作,然后向下移动到下6行并重复。在

实际输出需要是256x256像素值的数组。我需要处理的实际数据集是每个像素14位-它是3584x32(14位*256像素=3584行。。。32字节*8位/字节=32字节)。在

处理数据集的最佳方法是什么?此外,速度是一个关键问题,那么是否有一些高速功能可以利用?在

感谢你的帮助-谢谢!在


编辑:

为了回答有关所需速度的问题-理想情况下,我希望至少执行10倍/秒,因为数据以60倍/秒的速度传入。因此,我认为我需要避免常见的'joins'和string操作,因为我认为这些操作非常慢。在

同样,真实的数据集(3584x32)每个像素有14位,所以它是3584x32。在

以下是我正在使用的函数,使用Joran的方法,当提供真实数据集时,执行该函数需要大约2.6秒:

def GetFrame(RawData):
    if np.shape(RawData) == (3584, 32):
        ProcessedData = np.zeros((256, 256), dtype='int16')
        data_blocks = [RawData[d:d+14] for d in range(0, 3584, 14)]
        for p in range(256):
            data_bin_rows = ["".join(map(lambda val:"{0:08b}".format(val,), row)) for row in data_blocks[p]]
            ProcessedData[p][:] = [int("".join(v),2) for v in zip(*data_bin_rows)]
        return ProcessedData
    else:
        return False

怎样才能更快地缩短执行时间?谢谢!在


Tags: 数据方法函数infordata字节格式
2条回答

使用numpy应该足够快,或者您需要使用assembler编写它:

import numpy
input_array = numpy.zeros((32,14,256), dtype="B")
output_array = numpy.zeros((32,8,256), dtype='int16')
for j in range(8):
    bits = (input_array[:,:,:]>>j) & 1
    for i in range(14):
        output_array[:,j,:]|= bits[:,i,:] << i

我不得不读了几遍,但我想我明白了

data = \
"""255    255    255    255    255    255    255    255
127    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255
255    255    255    255    255    255    255    255"""

data_rows = [map(int,row.split()) for row in data.splitlines()]
data_bin_rows = ["".join(map(lambda val:"{0:08b}".format(val,),row)) for row in data_rows]
pixel_values = zip(*data_bin_rows)
print pixel_values[0],"=",int("".join(pixel_values[0]),2) #pixel0

无法用它的速度说话。。。但如果你一秒钟不做一百万次,这可能是合理的。。。无论如何,应该比串行读取快得多。。。在

相关问题 更多 >