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

Convert rows of hexadecimal values to binary, vertically by column

本文关键字:转换 二进制 垂直 十六进制      更新时间:2023-10-16

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

为了展示该格式,我将举例说明如果每个像素都有一个6位值: <>之前"像素#"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 255…2 255 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 255 255…5 255 255 255 255 255 255 255 255 255…注意,第二行以值127开始之前

要获得第一个像素(像素# 0)的6位值,必须满足以下条件:

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

:

<>之前"像素#"0-8 9-16 17-24 25-32…256--------------------------------------------------------------0 *1* 11111111 11111111 11111111…1 *0* 11111111 11111111 11111111…2 *1* 11111111 11111111 11111111…3 *1* 11111111 11111111 11111111…4 *1* 11111111 11111111 11111111…5 *1* 11111111 11111111 11111111…注意,第二行的值是127,也就是二进制的01111111像素0 = 101111 = 47之前

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

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

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

感谢你的帮助-谢谢!


编辑:

要回答有关所需速度的问题-理想情况下,我希望至少执行10x/秒,因为数据以60x/秒的速度进入。因此,我认为我需要避免常见的"连接"和字符串操作,因为我认为这些操作相当慢。

同样,真实的数据集(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

如何才能更快地降低执行时间?谢谢!

我读了好几遍,但我想我懂了

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

无法形容它的速度…但如果你不是一秒钟做一百万次,这可能是合理的……在任何情况下都应该比串行读取快得多…

使用numpy应该足够快,否则您需要使用汇编器编写:

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