2017-07-12 21 views
0

当调试应用程序时,我在内存中发现了一个100%确定的结构,只包含4个字符串。虽然我不太确定如何将其转换为数据结构,因此我可以使用结构指针地址来访问值。例如,下面是数据结构看起来像在内存中的内容(作为一个例子可以说是始终位于内存地址为0x123456)enter image description hereC++将内存转换为数据结构

的4个独立的串

string 1 = ad 
string 2 = dgdhkkkkkkhkk 
string 3 = ggghhjk 
string 4 = dgcfoh 

和我有数据structureconsists尝试创建像

struct reversedConnectionDat_t 
{ 
    char * data1; 
    char * data2; 
    char * data3; 
    char * data4; 
} 

数据结构,这是我试过访问数据

reversedConnectionDat_t * storeDat = (reversedConnectionDat_t*)0x123456; 
print(storeDat->data3); 

但它似乎没有工作。我没有正确地从内存中读取字符串吗?

(Oh和琴弦有时会从我张贴在示例代码改变张贴以上,即,有时串1的长度将是7和串3将只在长度等2 ...)

+0

内存不包含指针,所以你的结构不应该。使用简单的字符数组。并禁用填充和对齐... – Thomas

+0

他们看起来不像字符串,你怎么确定这是他们是什么? – harold

+0

@harold我知道它们传递给它的函数。该函数需要4个参数,并且所有4个都是字符串。 – reflexdev

回答

0

您正在使用指针(char*),并且您的结构的结构大小是4个指针的大小。如果你想获得字符串,你应该使用固定大小的数组(char[])。

这只有在您的字符串大小等于缓冲区大小时才有效。

IMO最好的办法是让在字符数组,然后找到空终止 /0,然后配置你的指针指向每个字符串的开始(在开始和第3轮空字符串结束之后)。

char* pointerToMem = something; //your strings data 
yourStruct.str1 = pointerToMem; 
while(*pointerToMem != '\0') 
{ 
    pointerToMem++; 
} 
yourStruct.str2 = pointerToMem + 1; 

这是如何使指针的结构工作。这段代码不是最优的,你不应该使用它,但它显示了你如何从内存中获取字符串。要有一个C字符串,你只需要第一个字符的地址和最后一个空终止符。

+0

有一个错字,你写了空字符作为''/ 0'',而它应该是''\ 0'' – WhiteSword

+0

@ManjinderSinghHanjra是的,谢谢。 –

+0

*这只有在您的字符串大小等于缓冲区大小时才有效。*这是不正确的。这些字符串是以0结尾的,所以只要字符串长度不超过缓冲区大小,'char []'将起作用。 –

2

您有一个指向指针结构的指针,所以即使您将结构指向正确的内存地址,结构中仍然存在未初始化的指针。你需要为他们提供实际的记忆。我会尝试设置你的结构像这样...

struct reversedConnectionDat_t 
{ 
    char data1 [3]; 
    char data2 [50]; 
    char data3 [50]; 
    char data4 [50]; 
} 

顺便说一句,我没有指望空格。我只是猜测它,但你明白了。

+0

问题是字符串不是一致的大小。即他们有时会改变,所以他们并不总是我在 – reflexdev

+0

上面的示例代码中放入的内容@reflexdev:您可以使char数组成为字符串的最大大小*。例如,如果您的第一个字符串始终是一个或两个字符,再加上空终止符,那么您将使第一个数组的长度为3,如答案中所示。它看起来像数据是几个最大长度的缓冲区,以0结尾的字符串。如果是这样的话,那么这个答案是正确的(只要你为'data2','data3'等提供正确的缓冲区大小)。 –

0

我不明白你的代码有什么问题,除了你的代码magicnumber:0x123456,这些代码可能不适合你的结构。你确定你的magic-number导致数据兼容你定义的结构吗?比如,如果您尝试访问storeDat->data3,那么它肯定会导致seg-fault,除非您执行以下操作或者您非常幸运。

struct R{ 
    char *a; 
    char *b; 
}; 

int main(void) 
{ 
    struct R *r1 = (struct R*) malloc(sizeof(struct R)); 
    r1->a = "12333";  //Pointing to a string literal 
    r1->b = "12331";  //Pointing to a string literal 

    int address = (int)&r1; 
    struct R *r2 = (struct R*) address; 
    std::cout<<r2->b; 
    return 0; 
} 

P.S. - 我不是一个好的程序员。但只是好奇地回答,因为我认为这可能会有所帮助。对不起,如果我无法正确理解你的问题。

1

我想你已经错误地确定了数据结构。我怀疑你所拥有的是三个独立的缓冲区,每个缓冲区都可以保存一个或多个以空字符结尾的字符串。

第一个结构是68个字节长,包含"ad\0dgdhkkkkkkhkk\0"(然后充分\0填充缓冲区。

这有可能是此缓冲区真的只有64字节长,并且这四个字节,用于后一些其他数据元素。

第二缓冲看起来是64个字节长,包含一个字符串以及填充用\0字符填写64个字节。

这是不可能的说第三缓冲器有多长。我们所知道的就是它足够长以容纳字符串"dgcfoh\0"。我想猜想缓冲区是64字节长,但愿意修改那个意见,如果我得到更多的数据。

我想你想的结构是:

struct s 
{ 
    char data1[68]; // buffer holds one or more null-terminated strings 
    char data2[64]; 
    char data3[64]. 
} 

根据您提供给我们的信息很少,这就是我想要下手。然后你需要一种方法来解析一个由null结尾的字符串的缓冲区。也就是说,从第一个缓冲区获取两个单独的字符串。这是一个相当简单的C代码。