2011-02-04 6 views
0

私はJavaのプログラムをcで変換しようとしています。 私はプログラミングを知らない、私はビットbtwを理解したいと思います。 はJavaの配列のポインタを変換します

はよく私はC言語でこれらの機能を持っている:

static int memcmp(Byte *a, Byte *b, int len) { 
    int i; 
    for (i = 0; i < len; i++) 
     if (a[i] != b[i]) 
      return 0; 
    return 1; 
} 

static int rfind(Byte *data, int pos, int leng) { 
    int i; 
    for (i = pos - leng; i > -1; i--) 
     if (memcmp(data+i, data+pos, leng)) 
      return i; 
    return pos; 
} 

いる私はトレーニングすることはできません。 関数memcmpは2つのメモリブロックを比較しているようです。 私はデータのサイズを取得する場合:

printf("size %d \n", sizeof(data)); 

をのorignalサイズは(ポインタについて何か良いドキュメントが歓迎されている)、32または40ことができますが、私は結果のために8を得ました。 Javaのこのビットを変換するために私を助けることができる

誰もがすべての私の感謝の気持ちを持っている(とそれ以上)します。文字列とバイト配列のあなたがArrays.equals()を使用することができますを比較する おかげ

答えて

0

Javaは、ポインタを持っていないのlastIndexOfを使用することができます。 Cでは、ポインターを配列として扱うことができますが、Javaでは同じ配列に索引を使用する必要があります。私が思い付くことができますので、これは直接翻訳として多かれ少なかれです:

public int rfind(byte[] data, int pos, int len) { 
    for (int i = pos - len; i > -1; i--) { 
     if (memcmp(data, i, pos, len)) { 
      return i; 
     } 
    } 
    return pos; 
} 

public boolean memcmp(byte[] data, int idx1, int idx2, int len) { 
    for (int i = idx1; i <= len; i++) { 
     if (data[i] != data[idx2 + i]) { 
      return false; 
     } 
    } 
    return true; 
} 

EDIT

アユシュが指摘するようにdata配列はASCII文字列がある場合、あなたは同じ結果を得ることができますライブラリーコールを使用することで、非常に簡単な方法で実行できます。

String str = new String(data); // convert data byte array to String 
String sub = str.substring(pos, len); // substring pointed to by pos 
int rfindResult = str.lastIndexOf(sub); 
+0

私はmemcmpのほうが1つではなく2つの配列を与える方が便利だと思います。 –

+0

一般的にはもっと便利ですが、rfindでそれを使用するには、2つの新しい配列を作成し、元の配列から新しい配列に必要な範囲をコピーする必要があります。それはうまくいくが、非常に非効率的である。 –

0

は限りRFINDが行くように、あなたが直接コードを変換することはできませんので、()http://forums.devshed.com/java-help-9/the-equivanent-of-rfind-in-java-603139.html

+0

これはもちろん、バイト配列が実際に文字列であることを前提としています。これは合理的な仮定のようですが、それが当てはまる場合、元のコードではchar *を使用するのではなく、Byte *を使用すると思います。 –

関連する問題