2009-08-12 36 views
1

JavaからC#にコードを移植する必要があります。 Javaコードでは、メソッド "ByteBuffer.flip()"と "ByteBuffer.slice"が使用されていますが、これをどのように翻訳するかわかりません。.NETの "ByteBuffer.flip"& "ByteBuffer.slice"に相当するものは何ですか?

私はこの質問(An equivalent of javax.nio.Buffer.flip() in c#)を読んだことがありますが、回答はありますが、どのように適用するのかわかりません。 Tom Hawtinによると、「現在の位置に制限を設定して、その位置をゼロに設定する」必要があります。これらの値を変更する方法は不明です。 (基本的なロジックを説明することができれば、それは私を助けてくれるはずです:)

ByteBuffer.sliceに関して、私はそれをどのように翻訳するかについての手がかりはありません。

EDIT:それは実際のコードで明確にすることができれば、私はそれを投稿します:

の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 

ありがとうございました!

EDIT:Javaドキュメントに基づいてb.BaseStream.SetLength(b.BaseStream.Length);からb.BaseStream.SetLength(b.BaseStream.Position);に変更されました。

+0

Quick FYI:これらの同等物は、.NETにあり、C#ではありません。 –

+0

ありがとう:)編集されました。 – Lazlo

+0

ByteBufferにはどのような構造体を使用していますか?リスト、バイト[]など? – SwDevMan81

答えて

1

(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を見る)

フリップは、バッファをリセットする簡単な方法です。ですから、例えば のために(擬似コード)

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

をすばやくセットアップあなたはおそらくちょうど最初から読み取るために書いたバッファをすることができます。

更新: スプライスによるバッファのコンテンツへの変更は、新しいバッファに表示されます」の要件、およびその逆にビットトリッキーである2つのバッファの位置、リミット、及びあろう値をマーク独立した "。残念なことに、あなた自身のクラスを作ることなく、バッファの共有部分(私が知っているのは、常に配列を使用し、以下で詳しく説明します)の概念はありません。あなたができる最も近いものはこれです:

旧コード:

ByteBuffer b = buff.slice(); 

新しいコード(一覧を想定)

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

上記のコードの欠点は、のために方法がないということですc#新しいバッファの新しい開始点を保持し、それを引き続き共有します。 forループ(i = bStart; ...)からインデックス(newList [i + bStart] ...)まで、何かを行うときはいつでも新しい開始点を手動で使用する必要があります。

代わりに使用するバイト[]配列を行うには、このような何かを行うに:

Byte[] b = &buff[buffPos]; 

しています...しかし有効にする危険な操作を必要とし、私はそのsafteyを保証することはできません、ガベージコレクタのために、私の回避という「安全でない」機能の

それ以外の場合は、常に独自のByteBufferクラスを作成します。

+0

ありがとうございました。コード例を含め、投稿をもう一度読んでください。私は私が間違っている場合、私は正しい "フリップ()"同等の仕事をしたと思う、私を修正します。今度はあなたのslice()メソッドを実装しようとします。私はそれを投稿し、それが良いことを願っています。 :) – Lazlo

+0

私は自分のフリップ方法を自分のものに合わせて変更しました。今はもっと適切だと思います。私はあなたのスライス方法をまだ待っています。助けてくれてありがとう。 :) – Lazlo

+0

私はもう一度更新しました。 – cyberconte

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); 
    } 
} 
+0

自分のByteBufferクラスを作成しようとするかもしれませんが、実際には難しいです。 – Lazlo

関連する問題