将十六进制值的行垂直按列转换为二进制
Convert rows of hexadecimal values to binary, vertically by column
我正在处理来自串行设备的数据,该设备以非常有趣的格式输出其数据。该设备有一个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位值,必须满足以下条件:
- 行中的每个值都需要被视为其二进制/位等效
- 垂直读取,从每一行对齐的位,向下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
相关文章:
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- C++从二进制转换为十进制数
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 如何在 O(n) 中将二进制和转换为二进制
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 在C++中将结构转换和存储为二进制
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 如何在C ++中将二进制字符串128位转换为十进制字符串?
- 如何将二进制文件头示例代码 (C++/C#) 转换为 Python?
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- 将二进制转换为十进制,我如何要求用户仅输入二进制
- QTextStream的操作数到二进制的转换无效
- 在c++中读取和转换二进制数据
- c++转换二进制到十进制从字符串输入
- 计算器转换二进制到浮点值-我做错了什么