C# “的等价物是什么?”;ByteBuffer.flip“&&引用;ByteBuffer.slice“;在.NET中?
我需要将代码从Java移植到C。在Java代码中,使用了方法“ByteBuffer.flip()”和“ByteBuffer.slice”,我不知道如何翻译 我已经读过这个问题(),但尽管给出了答案,但我不知道如何应用它。根据Tom Hawtin的说法,我应该在底层数组中“将限制设置为当前位置,然后将位置设置为零”。我不确定如何更改这些值。(如果你能解释一下基本的逻辑,这会对我有很大帮助:) 至于ByteBuffer.slice,我不知道如何翻译它 编辑:如果它能更清楚地与实际代码,我会张贴它: 爪哇: 到目前为止,我在C#NET中的翻译是: 谢谢大家! 编辑:更改C# “的等价物是什么?”;ByteBuffer.flip“&&引用;ByteBuffer.slice“;在.NET中?,c#,memorystream,slice,flip,bytebuffer,C#,Memorystream,Slice,Flip,Bytebuffer,我需要将代码从Java移植到C。在Java代码中,使用了方法“ByteBuffer.flip()”和“ByteBuffer.slice”,我不知道如何翻译 我已经读过这个问题(),但尽管给出了答案,但我不知道如何应用它。根据Tom Hawtin的说法,我应该在底层数组中“将限制设置为当前位置,然后将位置设置为零”。我不确定如何更改这些值。(如果你能解释一下基本的逻辑,这会对我有很大帮助:) 至于ByteBuffer.slice,我不知道如何翻译它 编辑:如果它能更清楚地与实际代码,我会张贴它:
b.BaseStream.SetLength(b.BaseStream.Length)代码>至b.BaseStream.SetLength(b.BaseStream.Position)代码>,基于Java文档。(有关Java调用,请参见和)
翻转是重置缓冲区的快速方法。比如说
(伪代码)
允许您快速设置可能刚写入的缓冲区,以便从头开始读取
更新:
由于“对该缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的”这一要求,拼接有点棘手。不幸的是,如果不创建自己的类,就没有缓冲区共享部分的概念(据我所知,总是使用数组,详见下文)。你能做的最接近的事情是:
旧代码:
ByteBuffer b = buff.slice();
新代码(假定为列表)
。。。然而,这需要启用不安全的操作,我不能保证它的安全性,因为垃圾收集器和我对“不安全”特性的避免
除此之外,您还可以创建自己的ByteBuffer类。未经测试,但如果我正确理解java的内容,这将为您提供如何实现的想法
public class ByteBuffer {
private int _Position;
private int _Capacity;
private byte[] _Buffer;
private int _Start;
private ByteBuffer(int capacity, int position, int start, byte[] buffer) {
_Capacity = capacity;
_Position = position;
_Start = start;
_Buffer = buffer;
}
public ByteBuffer(int capacity) : this(capacity, 0 , 0, new byte[capacity]) {
}
public void Write(byte item) {
if (_Position >= _Capacity) {
throw new InvalidOperationException();
}
_Buffer[_Start + _Position++] = item;
}
public byte Read() {
if (_Position >= _Capacity) {
throw new InvalidOperationException();
}
return _Buffer[_Start + _Position++];
}
public void Flip() {
_Capacity = _Position;
_Position = _Start;
}
public ByteBuffer Slice() {
return new ByteBuffer(_Capacity-_Position, 0, _Position, _Buffer);
}
}
仅供参考:这些等价物应该在.NET中,而不是在C#中。您对ByteBuffer使用的是什么类型的结构?列表、字节[]等?我使用的是字节[]结构。谢谢你的回答。请你再读一遍这篇文章,包括代码示例,好吗?我认为我在“flip()”等价物上做了正确的工作,如果我错了,请纠正我。我现在将尝试实现slice()方法。我会把它寄出去,希望它是好的。:)我已经修改了我的翻转方法以适合你的。我认为现在更合适。我还在等你的切片方法。谢谢你的帮助。:)我可能会尝试创建自己的ByteBuffer类,但这确实很难做到。
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
Byte[] b = &buff[buffPos];
public class ByteBuffer {
private int _Position;
private int _Capacity;
private byte[] _Buffer;
private int _Start;
private ByteBuffer(int capacity, int position, int start, byte[] buffer) {
_Capacity = capacity;
_Position = position;
_Start = start;
_Buffer = buffer;
}
public ByteBuffer(int capacity) : this(capacity, 0 , 0, new byte[capacity]) {
}
public void Write(byte item) {
if (_Position >= _Capacity) {
throw new InvalidOperationException();
}
_Buffer[_Start + _Position++] = item;
}
public byte Read() {
if (_Position >= _Capacity) {
throw new InvalidOperationException();
}
return _Buffer[_Start + _Position++];
}
public void Flip() {
_Capacity = _Position;
_Position = _Start;
}
public ByteBuffer Slice() {
return new ByteBuffer(_Capacity-_Position, 0, _Position, _Buffer);
}
}