You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将索引数组转换为Arduino适用的8×8十六进制3D位图?

3D立方体索引转Arduino 8×8十六进制Bitmap数组

需求

将表示3D立方体8层点位的索引数组,转换为适用于Arduino的8×8十六进制byte数组,数组中每个byte的8个bit对应立方体的8层状态。

输入数据

输入为包含8个子数组的索引列表,每个子数组对应立方体的一层(massive[0]为底层,massive[7]为顶层):

massive = [[63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55], 
           [63, 56, 0, 7], 
           [63, 56, 0, 7], 
           [35, 36, 27, 56, 28, 0, 7, 63], 
           [63, 56, 0, 7, 36, 35, 27, 28], 
           [63, 7, 56, 0], 
           [7, 0, 56, 63], 
           [7, 6, 5, 4, 3, 2, 1, 0, 8, 16, 32, 24, 40, 48, 56, 57, 58, 59, 60, 61, 62, 63, 55, 39, 47, 31, 23, 15]]

期望输出格式

输出为符合Arduino语法的8×8十六进制数组,示例如下:

{
    {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF},
    {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81},
    {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81},
    {0x81, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81},
    {0x81, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x81},
    {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81},
    {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81},
    {0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF},
};

错误代码及问题

原代码因错误遍历索引范围导致IndexError,错误代码如下:

massive = [[63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55], 
           [63, 56, 0, 7], 
           [63, 56, 0, 7], 
           [35, 36, 27, 56, 28, 0, 7, 63], 
           [63, 56, 0, 7, 36, 35, 27, 28], 
           [63, 7, 56, 0], 
           [7, 0, 56, 63], 
           [7, 6, 5, 4, 3, 2, 1, 0, 8, 16, 32, 24, 40, 48, 56, 57, 58, 59, 60, 61, 62, 63, 55, 39, 47, 31, 23, 15]]


rows, cols = (8, 8)
arr = [['' for i in range(cols)] for j in range(rows)]
arr[0][0] = ''

for row in arr:
  print(row)


def convert():
  for i in range(0, 64):
    for n in range(0,64):
      for each in massive:
        if i == massive[massive.index(each)][n]:
          arr[massive.index(each)][n] = '1'
        else:
          arr[massive.index(each)][n] = '0'

convert()

for row in arr:
  print(row)

错误输出:

['', '', '', '', '', '', '', '']
['', '', '', '', '', '', '', '']
['', '', '', '', '', '', '', '']
['', '', '', '', '', '', '', '']
['', '', '', '', '', '', '', '']
['', '', '', '', '', '', '', '']
['', '', '', '', '', '', '', '']
['', '', '', '', '', '', '', '']
Traceback (most recent call last):
  File "main.py", line 28, in <module>
    convert()
  File "main.py", line 23, in convert
    if i == massive[massive.index(each)][n]:
IndexError: list index out of range

正确实现代码

以下是简洁的正确转换代码,核心逻辑是将每个索引映射到8×8矩阵的位置,并通过位运算设置对应层的状态:

massive = [[63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55], 
           [63, 56, 0, 7], 
           [63, 56, 0, 7], 
           [35, 36, 27, 56, 28, 0, 7, 63], 
           [63, 56, 0, 7, 36, 35, 27, 28], 
           [63, 7, 56, 0], 
           [7, 0, 56, 63], 
           [7, 6, 5, 4, 3, 2, 1, 0, 8, 16, 32, 24, 40, 48, 56, 57, 58, 59, 60, 61, 62, 63, 55, 39, 47, 31, 23, 15]]

# 初始化8x8的数组,每个元素初始为0(对应8位全灭)
bitmap = [[0 for _ in range(8)] for _ in range(8)]

# 遍历每一层,设置对应点位的bit
for layer_idx, points in enumerate(massive):
    for point_idx in points:
        # 计算点位对应的矩阵行和列:point_idx = 行号*8 + 列号
        row = point_idx // 8
        col = point_idx % 8
        # 将对应层的bit设为1(layer_idx对应bit的位置,0为最低位,7为最高位)
        bitmap[row][col] |= (1 << layer_idx)

# 输出符合Arduino格式的十六进制数组
print("{")
for row in bitmap:
    hex_values = [f"0x{byte:02X}" for byte in row]
    print(f"    {{{', '.join(hex_values)}}},")
print("};")

代码说明

  1. 初始化矩阵:创建8×8的全0数组,每个元素代表一个byte,初始状态为所有层都灭。
  2. 映射点位:每个索引point_idx对应矩阵的行 = point_idx // 8,列 = point_idx % 8。
  3. 位运算设置状态:用1 << layer_idx生成对应层的bit掩码,通过|=操作将该bit设为1,表示该层的此点位点亮。
  4. 格式输出:将每个byte转换为两位十六进制格式,输出为Arduino支持的数组结构。

内容的提问来源于stack exchange,提问作者zаѓатhᵾѕтѓа

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:55:44