我正在尝试打印地址指向的值,但问题是我需要根据传递给我的大小取消引用该指针。所以这种东西:
void print(Address addr, Int size) {
...
}
我对如何实现这一点有点困惑。有人可以指出我正确的方向吗?
编辑:好的,所以我在想:
char p[80];
memset(p, '\0', 80);
memcpy(p, addr, size);
然后解引用为 *p。如果有更好的方法或正确的方法,请告诉我
我正在尝试打印地址指向的值,但问题是我需要根据传递给我的大小取消引用该指针。所以这种东西:
void print(Address addr, Int size) {
...
}
我对如何实现这一点有点困惑。有人可以指出我正确的方向吗?
编辑:好的,所以我在想:
char p[80];
memset(p, '\0', 80);
memcpy(p, addr, size);
然后解引用为 *p。如果有更好的方法或正确的方法,请告诉我
你的问题很不清楚。如果您的意思是要从传递的地址转储任意二进制数据,您需要类似:
void print(const unsigned char *addr, size_t size)
{
while (size--) printf("%.2x", *addr++);
}
或者,如果您的意思是要打印非空终止的字符数据,请尝试:
void print(const char *addr, int size)
{
printf("%.*s", size, addr);
}
您可以在例程中使用 switch 语句:
switch (size) {
case 1: print( *(char*)pointer); break;
case 2: print( *(short*)pointer); break;
case 4: print( *(long *)pointer); break;
case 8: print( *(__int64*)pointer); break;
default: puts( "unsupported);
}
(“print”是打印各种大小整数的例程,可能使用 C++ 多态性)
一个复杂的解决方案是使用 C++ 模板,例如使用Integer
在调用时由实际变量类型替换的参数类型。然后,该例程可以作用于该Integer
变量的大小(可能从 1 到 8 不等,如果您自己实现更长的整数,则可能更大)。这种方法的缺点是编译器为每种类型的参数生成一个例程实例,并且依赖于大小的逻辑将导致某些测试的“始终为真”条件。一个简单的方法是始终使用您期望的最长整数类型。
如果它是一个数字,我认为它是,你将需要这样的东西:
int n=0;
if (size>sizeof(int)) { return; //int is too small };
for (int i=0;i<size;i++) {
((char*)(&n))[sizeof(int)-(i+1)] = ((char*)addr)[size-(i+1)];
}
printf("%d",n);