2

私は、いくつかの 1024 ビット数 ( C でGMPを使用) が生成される暗号化プロジェクトに取り組んでいます。これらの番号は、Java プログラムを介して伝達されます (C ファイルは JNI を介して呼び出されます)。これらの大きな数値を Java プログラムに返す必要があります。さて、データ型は と で異なります。ではmpz_tBigIntegerどのネイティブデータ型を使用する必要がありますか?

4

2 に答える 2

2

jbyteArrayBigIntegerJavabyte[]との間でシリアル化および逆シリアル化することmpz_tができ、ヘッダーなしで同じバイト シーケンスのように見える構造との間でシリアル化および逆シリアル化することができるためです。

于 2013-11-09T22:03:09.497 に答える
1

Cパート。

#include <jni.h>

jbyteArray array(mpz_t *m) {
  const size_t size = sizeof (mpz_t);
  jbyteArray jbytes = (*env)->NewByteArray(env, (jsize) size);
  if (result != NULL) {
    jbyte *cbytes = (*env)->GetByteArrayElements(env, result, NULL);
    if (cbytes != NULL) {
      int i;
      for (i = (int) (size - 1); i >= 0; i--) {
        cbytes[i] = (jbyte) (*m & 0xFF);
        *m >>= 8;
      }
      (*env)->ReleaseByteArrayElements(env, result, cbytes, 0);
    }
  }
  return result;
}

JNIEXPORT jbyteArray JNICALL Java_Test_bytes(JNIEnv *env, jclass cls) {
  mpz_t *m = getSome();
  return array(m);
}

ジャバ部分。

static native byte[] bytes();

static BigInteger bigInteger() {
    final byte[] bytes = bytes();
    return bytes == null ? null : new BigInteger(1, bytes);
}

最初の引数1は正を意味することに注意してくださいsignum

于 2015-06-06T03:29:48.447 に答える