C# “的等价物是什么?”;ByteBuffer.flip“&&引用;ByteBuffer.slice“;在.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,我不知道如何翻译它 编辑:如果它能更清楚地与实际代码,我会张贴它:

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

我已经读过这个问题(),但尽管给出了答案,但我不知道如何应用它。根据Tom Hawtin的说法,我应该在底层数组中“将限制设置为当前位置,然后将位置设置为零”。我不确定如何更改这些值。(如果你能解释一下基本的逻辑,这会对我有很大帮助:)

至于ByteBuffer.slice,我不知道如何翻译它

编辑:如果它能更清楚地与实际代码,我会张贴它:

爪哇:

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

谢谢大家!

编辑:更改
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);
    }
}