c ++メモリをデータ構造に変換

When debugging an application I have found in memory a structure that I am 100% certain only consists of 4 strings. Though I am not quite sure how I would convert it to a data structure so I can use the structures pointer address to access values. For example here is what the data struct looks like in memory (as an example lets say it is CONSISTENTLY located at the memory address 0x123456) enter image description here

データ構造は4つの別々の文字列からなる

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

そして私は次のようなデータ構造体を作成しようとしました

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

これが私がデータにアクセスした方法です

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

しかし、うまくいかないようです。メモリから文字列を正しく読み取れませんか。

(ああ、文字列は上の例のコードで投稿したものとは異なる場合があります。つまり、文字列1の長さが7、文字列3の長さが2になるなどです。)

0
メモリにはポインタが含まれていないので、あなたの構造体もそうすべきではありません。プレーン文字配列を使用してください。そしてパディングと配置を無効にします...
追加された 著者 Thomas,
彼らは私には文字列のようには見えません。
追加された 著者 harold,
@ハロルド私は彼らが渡されている関数を知っています。この関数は4つのパラメータを取り、4つすべてが文字列です。
追加された 著者 reflexdev,

4 答え

ポインタの構造体へのポインタがあるので、構造体を正しいメモリアドレスを指す場合でも、構造体内に未初期化ポインタがあります。実際のメモリを用意する必要があります。私はこのようにあなたの構造を設定しようと思います...

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

ところで、私はスペースを数えなかった。私はちょっとそれを推測しましたが、あなたはアイデアを得ます。

2
追加された
@reflexdev:char配列を文字列の最大サイズ にします。たとえば、最初の文字列が常に1文字または2文字で、NULL終端文字が続く場合は、答えに示すように、最初の配列の長さを3にします。データは、0で終わる文字列を持ついくつかの最大長バッファです。その場合、この答えは正しいものです( data2 data3 などに正しいバッファーサイズを指定した場合)。
追加された 著者 Jim Mischel,
問題は、文字列のサイズが一定していないことです。すなわちそれらは時々変更されるので、それらはいつも私が上の例のコードに入れたものではない
追加された 著者 reflexdev,

私はあなたがそのデータ構造を誤って識別したと思います。私はあなたが持っているのは3つの独立したバッファであり、それぞれが1つ以上のNULLで終わる文字列を保持することができると思います。

最初の構造は68バイト長で、 "ad \ 0dgdhkkkkkhkk \ 0" (その後にバッファを埋めるのに十分な \ 0 が続きます)。

このバッファの長さは実際には64バイトしかなく、それ以降の4バイトは他のデータ要素に使用される可能性があります。

2番目のバッファは64バイト長で、1つの文字列を含み、64バイトを埋めるために \ 0 文字が埋め込まれています。

3番目のバッファの長さを言うのは不可能です。私たちが知っているのは、文字列 "dgcfoh \ 0" を保持するのに十分な長さであるということだけです。バッファの長さは64バイトだと思いますが、もっと多くのデータが得られればその意見を修正しても構いません。

私はあなたが望む構造だと思います:

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

あなたが私たちに与えた乏しい情報に基づいて、それは私が始めることです。それから、nullで終わる文字列のバッファをパースする方法が必要です。つまり、最初のバッファから2つの個々の文字列を取得します。これはかなり簡単なCコードです。

1
追加された

ポインタ( char * )を使用していて、構造体の構造体サイズは4つのポインタのサイズです。文字列を取得したい場合は、固定サイズの配列( char [] )を使用してください。

これはあなたの文字列サイズがバッファサイズと等しい場合にのみ機能します。

IMOの最善の方法は、char配列を取得してからNULLターミネータを見つけることです。 /0 をクリックしてから、各文字列の先頭(最初の3つのNULLターミネータの直後と直後)を指すようにポインタを構成します。

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

これがポインタの構造体を機能させる方法です。このコードは最適ではないため、使用してはいけませんが、メモリから文字列を取得する方法を示しています。 C文字列を取得するには、最初の文字のアドレスと末尾にnullターミネータが必要です。

0
追加された
文字列のサイズがバッファのサイズと等しい場合にのみ機能します。これは正しくありません。文字列の長さがバッファサイズを超えない限り、文字列は0で終了します。 char [] は機能します。
追加された 著者 Jim Mischel,
@ ManjinderSinghHanjraええ、ありがとう。
追加された 著者 Petar Velev,
@ JimMischelが間違っています。固定サイズのバッファを割り当てる場合は、来る文字列が割り当てられたバッファと完全に一致するように祈る必要があります。そうでない場合、文字列からのデータはそれ以上スペースがなくなるまでバッファを順番に満たします。そのため、strbuffer1( char [] )が50バイトであれば、そこにすべての文字列を収めることができ、それらを読み込もうとしたときに最初の文字列しか得られません。次の3つのバッファはゴミでいっぱいになります
追加された 著者 Petar Velev,
タイプミスがあります。ヌル文字を '/ 0' と書いていますが、 ' \ 0' であるべきです。
追加された 著者 WhiteSword,

I couldn't understand what's wrong with your code except for your magicnumber:0x123456, casting which might not suit your structure. Are you sure your magic-number results in data compatible to the struct defined by you? Like, if you'll try to access storeDat->data3, it'll definitely be leading to seg-fault except you do something as follows or you are very lucky.

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<b;
    return 0;
}

P.S - 私は良いプログラマーではありません。私はそれがいくつかの助けになるかもしれないと思ったので、しかし、答えるだけで興味があった。申し訳ありませんが、私はあなたの問題を正しく理解できなかった場合。

0
追加された