14

私は構造体を持っていて、構造体へのポインターを持っています。最初の n バイトを長い 16 進数または 16 進バイトの文字列として出力したいと考えています。

基本的に、gdb のメモリ検査コマンド x/nxb に相当する printf が必要です。

可能であれば、プログラムのロガー関数として printf を使用したいと思います。データをループせずに実行できればさらに良いでしょう。

4

2 に答える 2

16

Eric Postpischilのアドバイスを受けて、次のことを作り上げました。

struct mystruc
{
  int a;
  char b;
  float c;
};

int main(int argc, char** argv)
{
  struct mystruc structVar={5,'a',3.9};
  struct mystruc* strucPtr=&structVar;
  unsigned char* charPtr=(unsigned char*)strucPtr;
  int i;
  printf("structure size : %zu bytes\n",sizeof(struct mystruc));
  for(i=0;i<sizeof(struct mystruc);i++)
      printf("%02x ",charPtr[i]);

  return 0;
}

構造が伸びるにつれて、バイトをfasとして出力します。

更新:洞察に感謝しますEric:)コードを更新しました。

于 2012-08-16T18:35:18.390 に答える
1

これを試して。に構造体へのポインタがあるとしpstructます。

unsigned long long *aslong = (unsigned long long *)pstruct;
printf("%08x%08x%08x%08x%08x%08x%08x%08x", 
       aslong[0],
       aslong[1],
       aslong[2],
       aslong[3],
       aslong[4],
       aslong[5],
       aslong[6],
       aslong[7],
);

Eric が指摘しているように、これによりバイトが順不同で出力される可能性があります。つまり、これか、unsigned char *and の使用 ( printf64 個の引数を持つ a またはループの使用) のいずれかです。

于 2012-08-16T18:06:15.127 に答える