2017-10-04 25 views
-1

私は構造体を指すchar *を持っています。ここに私の構造である:私はsizecodeAction回復キャストvoid * to char *

struct prot 
{ 
    int size; 
    unsigned short codeAction; 
    void *data; 
}; 

、今はdataを回復したいです。 私が最後の8バイトをキャストするとき、私は何も持っていません。

次のコードは、単なるテストである、それは悪いコードです:

char lol[4]; 
for (int i = 0; i < 4; i++) 
    lol[i] = test[i]; 

int size = *(int*)lol; 

char loli[2]; 
int index = 0; 
for (int i = 4; i < 6; i++) 
{ 
    loli[index] = test[i]; 
    index++; 
} 

int code = *(short*)loli; 

char lolo[8]; 
index = 0; 
for (int i = 6; i < size; ++i) 
{ 
    lolo[index] = test[i]; 
    index++; 
} 

void *newData = (char *)lolo; // how can I cast it? 

私はnewDataのコンテンツを表示するにはどうすればよいですか?

+0

どのようにデータを最初に書き出しましたか?あなたは本当にあなたのためにこのものを処理するシリアライズライブラリを使用することを検討する必要があります。 – NathanOliver

+1

cタグではC++タグよりも良い応答が得られるようです。 –

+1

'test'のタイプは何ですか? –

答えて

0

あなたの問題は、キャスト時にloloが定義したchar配列へのポインタを実際にキャストすることです。したがって、キャストの結果は配列の最初のセルへのポインタcharになります。

なぜこれを構造体として使用し、フィールドに定期的にアクセスしないのですか?

とにかく、loloを64ビットタイプのポインタとして使用し、それにアクセスする必要があります。 loloがいっぱいになるまで

void* newData = *((uint64_t*)lolo) 

のほかに、最後forループ、ループのみ8回でsizeまでループをしません。 newData自体のバイト数(ではなく、)は一定で、32ビットマシンでは4バイト、64ビットディスクでは8バイトです。

最後のもの - index++o++ではありません。私が見る限り、oは定義されていません。