14

我有一个结构体,指向一个结构体的指针,我希望将前 n 个字节打印为一个长十六进制数,或一个十六进制字节字符串。

本质上,我需要与 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;
}

它将在结构伸展时尽可能快地打印字节。

更新:感谢 Eric 的洞察力 :) 我已经更新了代码。

于 2012-08-16T18:35:18.390 回答
1

试试这个。假设您有指向 struct in 的指针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个参数或使用循环)。

于 2012-08-16T18:06:15.127 回答