RPC3

7 阅读1分钟
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; // 4096 = 2048 * 2 (short转2字节)
        byte[] result = new byte[totalBytes];

        // 4. 处理每个分组和通道
        for (int groupIdx = 0; groupIdx < groupCount; groupIdx++) {
            for (int chIdx = 0; chIdx < channels.size(); chIdx++) {
                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; i < 2048; i++) {
                        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;
        }
    }
}