3

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

我已经阅读了这个问题(相当于 c# 中的 javax.nio.Buffer.flip()),但是虽然给出了答案,但我不知道如何应用它。根据 Tom Hawtin 的说法,我应该在基础数组中“将限制设置为当前位置,然后将位置设置为零”。我不确定如何更改这些值。(如果您能解释基本逻辑,那将对我有很大帮助:)

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

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

爪哇:

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 文档。

4

2 回答 2

1

(参见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 类。

于 2009-08-12T15:48:50.323 回答
1

未经测试,但如果我正确理解了 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);
    }
}
于 2009-08-12T16:28:31.973 回答