1

私のプログラムには 2 つの uint8_t ポインターがあり、それらの値を比較したいと考えています。unsigned int を扱うのは良い考えではありません。これが私のコードです

static void bacast_signed_message()
{
  uint8_t *M = malloc(MAX_M_LEN*sizeof(uint8_t));//uint8_t M[MAX_M_LEN];//uint8_t *M;
  int M_len = MAX_M_LEN;;

  uint8_t *C = malloc((2*KEYDIGITS*NN_DIGIT_LEN + 1 + MAX_M_LEN + HMAC_LEN)*sizeof(uint8_t));   
  int C_len; 
  //uint8_t C[2*KEYDIGITS*NN_DIGIT_LEN + 1 + MAX_M_LEN + HMAC_LEN]; 

  uint8_t *dM = malloc(MAX_M_LEN*sizeof(uint8_t));  //uint8_t dM[MAX_M_LEN];
  int dM_len = MAX_M_LEN;

  random_data(M, MAX_M_LEN);

  printf("C before encrypt %p\n",*C);
  printf("M before encrypt %p\n",*M);
  printf("dM before encrypt %p\n",*dM);

  C_len = encrypt(C, (2*KEYDIGITS*NN_DIGIT_LEN + 1 + M_len + HMAC_LEN), M, M_len, &pbkey_alice);
  //encrypt(uint8_t *C, int C_len, uint8_t *M, int M_len, Point *PublicKey);

  printf("C after encrypt %p\n",*C);
  printf("M after encrypt %p\n",*M);
  printf("dM after encrypt %p\n",*dM);

  dM_len = decrypt(dM, dM_len, C, C_len, prKey_alice);   
  //decrypt(uint8_t *M, int M_len, uint8_t *C, int C_len, NN_DIGIT *d);

  printf("C after decrypt %p\n",*C);
  printf("M after decrypt %p\n",*M);
  printf("dM after decrypt %p\n",*dM);

  printf("C_len = %i , M_len = %i\n",C_len,M_len);

  if (dM == M){printf("Works\n");}
  else{printf("Not Works\n");}
}

そして、これは私が得たアウトプットです

C before encrypt 0x40
M before encrypt 0x28
dM before encrypt 0x70
C after encrypt 0x4
M after encrypt 0x28
dM after encrypt 0x70
C after decrypt 0x4
M after decrypt 0x28
dM after decrypt 0x28
C_len = 102 , M_len = 41
Not Works

そして、private_keyを変更した場合(公開鍵の変更なし)、次のようになります

C before encrypt 0x40
M before encrypt 0x28
dM before encrypt 0x70
C after encrypt 0x4
M after encrypt 0x28
dM after encrypt 0x70
C after decrypt 0x4
M after decrypt 0x28
dM after decrypt 0x70
C_len = 102 , M_len = 41
Not Works

つまり、dM は変更されていません。しかし、これについてはよくわかりません。%p の代わりに %u を使用すると、まったく異なる答えが得られます (%u を使用すると、10 進数に変換されると表示されます)。アドバイスをお願いします。これのどこが悪いのか教えてください。

前もって感謝します

4

2 に答える 2

2

あなたの質問を理解するための可能な方法

あなたのコードは現在、ポインタif (dM == M)を比較しています。したがって、現在、2 つのポインターが同じメモリ チャンクを示しているかどうかを確認しています。

質問のタイトルは、単一の数値を比較したいことを示唆しています。結局のところ、 anuint8_tは 0 から 255 の範囲の単一の数値です。そのような数値へのポインターがある場合は、それらを逆参照して実際の数値を取得する必要がありますif (*dM == *M)

しかし、あなたのコードは、実際にメモリ領域を比較したいことを示唆しています。配列へのポインターを逆参照することは、配列の最初の要素にアクセスすることと同じ (つまり、 と同じif (dM[0] == M[0])) であり、これはおそらく望んでいるものではありません。

メモリ領域の比較

memcmpメモリ領域の内容を比較するために使用できます。

if (dM_len == M_len && memcmp(dM, M, dM_len) == 0)

これは、「長さが同じで、2 つのメモリ領域の内容も同じである場合」を意味します。の結果memcmpがゼロでない場合、その符号は、どの値が大きいと見なされるかに関する情報を提供します。

印刷

呼び出しの はおそらく間違っていることに注意して%pください:はポインターを出力するためのものですが、関数呼び出しでそれらを逆参照しているため、実際にはを出力しています。そのため、はるかに適しています。例えば ​​の内容を印刷したい場合は、次のようなループを使用する必要があります。printf%p%uM

for (i = 0; i != M_len; ++i) {
  if (i%32 == 0 && i != 0) printf("\n"); /* wrap lines */
  printf("%02x", M[i]);
}
printf("\n");

これにより、1 行あたり 32 バイト (= 16 進数 64 桁) のデータが 16 進数で表示されます。この%02x形式はprintf、必要に応じてゼロでパディングし、すべてのバイトに常に 2 桁を使用するように指示します。

于 2012-09-26T07:16:48.327 に答える
2

「stdint.h」タイプを出力するための特定のマクロがあります。例えば:

#include <inttypes.h>

...
uint8_t u8 = 5;
printf("%"PRIu8, u8); // unsigned 
printf("%"PRIx8, u8); // hexadecimal

したがって、次のように変更する必要があります。

printf("C after decrypt %p\n",*C); 

printf("C after decrypt %"PRIu8"\n",*C);

これ%pはポインター (アドレス) を出力するためのものであり、指す値を指すものではないことに注意してください。また、参照Cを解除しているため、必要な結果が得られない可能性があります。

于 2012-09-26T06:38:54.500 に答える