将unsigned int地址视为指针并将其解除引用为字节数组

时间:2012-09-26 22:18:31

标签: c++ c pointers byte memory-address

所以,我有一个unsigned int变量,上面有一个十进制值地址,比方说unsigned int var = 1232342,我想要做的是,不知道变量的类型但是了解它的大小及其存储的地址,将值设为byte array。例如,假设我有int var = 20的地址和字节大小。我希望能够转到该地址并返回一个字节数组,在本例中为[00001100],对于char变量和结构的数据成员也是如此。

一点点伪代码就像:

for var.address until var.address = var.address + bytesize
    do 
       byte_array = *var.address
       var.address++ 

我遇到了一些问题,我是C的新手,所以我不知道如何将unsigned int视为地址/指针。其次,我不知道如何从地址中获取实际的字节数,每当我取消引用地址时,我得到的是它的实际值,但那就是我知道变量的类型。

一点背景知识: 我正在开发一个名为Pin的工具,它让我可以选择挂钩到正在运行的进程,然后我使用DWARF和ELF信息。所以我确实可以访问我试图访问的虚拟内存空间

2 个答案:

答案 0 :(得分:0)

“a”是您希望获得4个字节的地址。 “bytes”是您要存储结果的位置。我将“i”的地址分配给“a”,然后从该地址读取4个字节。

#include <stdio.h>
int main(int argc, char *argv[]) {
    unsigned char bytes[4];
    int i = 65535, j;
    unsigned long a = (unsigned long) &i;

    for (j = 0; j < 4; j++) {
        bytes[j] = *((unsigned char*) a + j);
    }

    for (j = 0; j < 4; j++) {
        printf("bytes[%d]: %d\n", j, bytes[j]);
    }
}

答案 1 :(得分:0)

epatel此处

查看hexdump功能

Off-the-Shelf C++ Hex Dump Code

尽管有标题,但它确实是C代码。为方便起见,我会将其复制到此处

#include <ctype.h>
#include <stdio.h>

void hexdump(void *ptr, int buflen) {
  unsigned char *buf = (unsigned char*)ptr;
  int i, j;
  for (i=0; i<buflen; i+=16) {
    printf("%06x: ", i);
    for (j=0; j<16; j++) 
      if (i+j < buflen)
        printf("%02x ", buf[i+j]);
      else
        printf("   ");
    printf(" ");
    for (j=0; j<16; j++) 
      if (i+j < buflen)
        printf("%c", isprint(buf[i+j]) ? buf[i+j] : '.');
    printf("\n");
  }
}