Frage

Ich muss Code von Java bis C#Portcode. Im Java -Code werden die Methoden "bytebuffer.flip ()" und "bytebuffer.lice" verwendet, und ich weiß nicht, wie man das übersetzt.

Ich habe diese Frage gelesen (Ein Äquivalent von javax.nio.buffer.flip () in C#), aber obwohl eine Antwort gegeben ist, kann ich nicht feststellen, wie ich sie anwenden soll. Laut Tom Hawtin sollte ich "die Grenze auf die aktuelle Position einstellen und dann die Position auf Null einstellen" in das zugrunde liegende Array. Ich bin mir nicht sicher, wie ich diese Werte ändern kann. (Wenn Sie die zugrunde liegende Logik erklären könnten, würde es mir sehr helfen :)

Was den Bytebuffer.lice betrifft, habe ich keine Ahnung, wie ich es übersetzen soll.

Bearbeiten: Wenn es mit dem tatsächlichen Code klarer sein kann, werde ich ihn veröffentlichen:

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);

Bisher meine Übersetzung in 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

Vielen Dank!

Bearbeiten: geändert b.BaseStream.SetLength(b.BaseStream.Length); zu b.BaseStream.SetLength(b.BaseStream.Position);, basierend auf den Java -Dokumenten.

War es hilfreich?

Lösung

(Schau Schau http://java.sun.com/javase/6/docs/api/java/nio/bytebuffer.html#slice%28%29 und http://java.sun.com/javase/6/docs/api/java/nio/buffer.html#flip%28%29 für Javas Anrufe)

Flip ist eine schnelle Möglichkeit, den Puffer zurückzusetzen. Also zum Beispiel (Pseudocode)

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

Ermöglicht Ihnen, den Puffer, den Sie vermutlich nur von Anfang an zu lesen haben, schnell einrichten.

Aktualisieren:Splice ist etwas schwieriger, da die Anforderung "Änderungen des Inhalts dieses Puffer im neuen Puffer sichtbar sind und umgekehrt; die Position, Grenze und Marke der beiden Puffer sind unabhängig". Es gibt leider kein Konzept eines gemeinsamen Teils des Puffers (von dem ich weiß - es verwendete immer Arrays, ohne dass unten detailliert ist), ohne Ihre eigene Klasse zu erstellen. Das nächste, was Sie tun könnten, ist Folgendes:

Alter Code:

ByteBuffer b = buff.slice();

Neuer Code (unter der Annahme einer Liste)

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

Der Nachteil des obigen Codes ist, dass C# keine Möglichkeit gibt, den neuen Ausgangspunkt des neuen Puffers zu halten und ihn trotzdem zu teilen. Sie müssen den neuen Ausgangspunkt manuell verwenden, wenn Sie etwas tun, von für Loops (für i = bstart; ...) bis zur Indexierung (neue Liste [i + bstart] ...)

Ihre andere Option besteht darin, stattdessen Byte [] -Arrays zu verwenden und so etwas zu tun:

Byte[] b = &buff[buffPos];

... Dies erfordert jedoch, dass unsichere Vorgänge aktiviert werden müssen, und ich kann aufgrund des Müllsammlers und meiner Vermeidung der "unsicheren" Funktionen nicht für seine Safey bürgen.

Außerdem machen es immer Ihre eigene Bytebuffer -Klasse.

Andere Tipps

Nicht getestet, aber wenn ich die Java -Bits richtig verstehe, würde Ihnen dies eine Idee geben, wie Sie implementiert werden sollen.

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top