package org.example
import java.nio.ByteBuffer
import java.util.List
//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class Main {
public static void main(String[] args) {
}
public static byte[] processChannels(List<Channel> channels) {
// 1. 计算最大数据长度
int maxLen = channels.stream()
.mapToInt(channel -> channel.getValues().size())
.max()
.orElse(0)
// 2. 计算分组数量(向上取整)
int groupCount = (int)Math.ceil(maxLen / (double)2048)
// 3. 初始化结果数组
int totalBytes = groupCount * channels.size() * 4096
byte[] result = new byte[totalBytes]
// 4. 处理每个分组和通道
for (int groupIdx = 0
for (int chIdx = 0
Channel channel = channels.get(chIdx)
List<Short> values = channel.getValues()
// 计算当前分组范围
int start = groupIdx * 2048
int end = Math.min(start + 2048, values.size())
int size = end - start
// 创建分组数据缓冲区
short[] groupData = new short[2048]
if (size > 0) {
short lastElement = values.get(values.size() - 1)
// 填充有效数据或末尾元素
for (int i = 0
groupData[i] = (i < size) ? values.get(start + i) : lastElement
}
}
// 转换为字节数组(大端序)
ByteBuffer buffer = ByteBuffer.allocate(4096)
for (short s : groupData) {
buffer.putShort(s)
}
// 计算结果数组偏移量
int offset = groupIdx * (channels.size() * 4096) + chIdx * 4096
System.arraycopy(buffer.array(), 0, result, offset, 4096)
}
}
return result
}
// 测试用Channel类
public static class Channel {
private List<Short> values
public Channel(List<Short> values) {
this.values = values
}
public List<Short> getValues() {
return values
}
}
}