gpt4 book ai didi

java - Javolution ByteBuffer 问题

转载 作者:行者123 更新时间:2023-11-29 03:54:52 24 4
gpt4 key购买 nike

我有以下 Javolution 实现:

public class RunScan extends Struct
{
public final Signed32 numOfClusters = new Signed32();
public final ClusterData[] clusters;
public final Signed32 numOfRecons = new Signed32();
public final ReconData[] recons ;

public RunScan (int numOfClusters, int numOfRecons)
{
this.numOfClusters.set(numOfClusters);
this.numOfRecons.set(numOfRecons);
clusters = array(new ClusterData[numOfClusters]);
recons = array(new ReconData[numOfRecons]);
}
}

public class ClusterData extends Struct
{
public final UTF8String scanType = new UTF8String(CommInterfaceFieldConstants.SCAN_TYPE_SIZE);
public final UTF8String patientId = new UTF8String(CommInterfaceFieldConstants.PATIENT_ID_SIZE);
.
.
.
}

public class ReconData extends Struct
{
public final UTF8String patientId = new UTF8String(CommInterfaceFieldConstants.PATIENT_ID_SIZE);
public final UTF8String scanSeriesId = new UTF8String(CommInterfaceFieldConstants.SCAN_SERIES_ID_SIZE);
.
.
.
}

在我们的通信类中,在将数据放入套接字之前,我们需要获取 RunScan 对象的 bytes[],但我们在“//<<<<<<<”行中获取 BufferUnderflowException:

private byte[] getCmdBytes(Struct scCmd)
{
ByteBuffer cmdBuffer = scCmd.getByteBuffer();
int cmdSize = scCmd.size();

byte[] cmdBytes = new byte[cmdSize];
if (cmdBuffer.hasArray())
{
int offset = cmdBuffer.arrayOffset() + scCmd.getByteBufferPosition();
System.arraycopy(cmdBuffer.array(), offset, cmdBytes, 0, cmdSize);
}
else
{
String msg = "\n\ncmdBufferRemaining=" + cmdBuffer.remaining() + ", cmdBytesSize=" + cmdBytes.length + "\n\n";
System.out.println(msg);
cmdBuffer.position(scCmd.getByteBufferPosition());
cmdBuffer.get(cmdBytes); //<<<<<<<<<< underFlowException
}

return cmdBytes;
}

此方法适用于其他情况。发生异常是因为这一行,

ByteBuffer cmdBuffer = scCmd.getByteBuffer();

只返回 RunScan 对象的 8 个字节(来自 remaining() 方法)ByteBuffer,我认为是那两个 Signed32 字段。但是这一行,

int cmdSize = scCmd.size();

返回 RunScan 对象的正确长度,其中包括这两个数组的大小。

如果我在声明它们时创建了这两个数组(而不是在构造函数中“新建”它们)并使用硬编码长度,它可以正常工作,没有任何异常。

谁能帮我弄清楚我们的实现有什么问题?

最佳答案

我的代码遇到了类似的情况。通常,对于当前的 Struct 对象,您不能在与包含数组中元素数的成员相同的结构中定义可变长度数组。

尝试这样的事情:

public class RunScanHeader extends Struct
{
public final Signed32 numOfClusters = new Signed32();
public final Signed32 numOfRecons = new Signed32();
}

public class RunScanBody extends Struct
{
public final ClusterData[] clusters;
public final ReconData[] recons ;

public RunScan (int numOfClusters, int numOfRecons)
{
clusters = array(new ClusterData[numOfClusters]);
recons = array(new ReconData[numOfRecons]);
}
}

然后您将需要一个两阶段方法来读取和写入,首先读取/写入 header 数据,然后读取/写入正文数据。

抱歉,我现在没有更多详细信息,如果您无法解决这个问题,请告诉我,我会重新研究我的代码。

关于java - Javolution ByteBuffer 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6914430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com