gpt4 book ai didi

c# - .NET 中 "ByteBuffer.flip"和 "ByteBuffer.slice"的等价物是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:51 56 4
gpt4 key购买 nike

我需要将代码从 Java 移植到 C#。在Java代码中,使用了方法“ByteBuffer.flip()”和“ByteBuffer.slice”,不知道怎么翻译。

我读过这个问题 ( An equivalent of javax.nio.Buffer.flip() in c# ),但虽然给出了答案,但我不知道如何应用它。根据 Tom Hawtin 的说法,我应该在底层数组中“将限制设置为当前位置,然后将位置设置为零”。我不确定如何更改这些值。 (如果你能解释一下底层逻辑,那将对我有很大帮助:)

至于ByteBuffer.slice,不知道怎么翻译。

编辑:如果实际代码更清晰,我会发布:

Java:

ByteBuffer buff;
buff.putShort((short) 0);
buff.put(customArray);
buff.flip();
buff.putShort((short) 0);
ByteBuffer b = buff.slice();

short size = (short) (customFunction(b) + 2);
buff.putShort(0, size);
buff.position(0).limit(size);

到目前为止,我在 C#.NET 中的翻译:

BinaryWriter b = new BinaryWriter(); //ByteBuffer buff;
b.Write((short)0); // buff.putShort((short) 0);
b.Write(paramStream.ToArray()); // buff.put(customArray);
b.BaseStream.SetLength(b.BaseStream.Position); // buff.flip; (not sure)
b.BaseStream.Position = 0; // buff.flip; too (not sure)
b.Write((short)0); // buff.putShort((short) 0)
??? // ByteBuffer b = buff.slice();

// Not done but I can do it, short size = (short) (customFunction(b) + 2);
??? // How do I write at a particular position?
??? // buff.position(0).limit(size); I don't know how to do this

谢谢!

编辑:将 b.BaseStream.SetLength(b.BaseStream.Length); 更改为 b.BaseStream.SetLength(b.BaseStream.Position);,基于Java 文档。

最佳答案

(请参阅 http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#slice%28%29http://java.sun.com/javase/6/docs/api/java/nio/Buffer.html#flip%28%29 了解 java 的调用)

翻转是一种重置缓冲区的快速方法。例如(伪代码)

void flip()
{
Length = currentPos;
currentPos = 0;
}

允许您快速设置您可能刚刚写入的缓冲区,以便从头开始读取。

更新:由于要求“对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的”,因此拼接有点棘手。不幸的是,如果不创建自己的类,就没有缓冲区共享部分的概念(我知道 - 总是使用数组,详见下文)。您可以做的最接近的事情是:

旧代码:

ByteBuffer b = buff.slice();

新代码(假设有一个列表)

List<Byte> b= buff;
int bStart = buffPos; // buffPos is your way of tracking your mark

上面代码的缺点是,c# 无法保存新缓冲区的新起点并仍然共享它。每当你做任何事情时,你都必须手动使用新的起点,从 for 循环(for i=bStart;...)到索引(newList[i + bStart]...)

您的另一个选择是使用 Byte[] 数组,并执行如下操作:

Byte[] b = &buff[buffPos];

...然而,这需要启用不安全的操作,由于垃圾收集器和我对“不安全”功能的回避,我无法保证其安全性。

除此之外,总是要创建您自己的 ByteBuffer 类。

关于c# - .NET 中 "ByteBuffer.flip"和 "ByteBuffer.slice"的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1266948/

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