2012-02-02 10 views
1

関数は、未知のDLLからポインタと長さ(引数を介して)を返します。C++はメモリアドレスでいくつかのバイトを読み込み、文字列として出力する

Result = SpamnEggs(&pBytes, &nBytes) 

ポインタは、nBytesの連続バイトである有効なメモリアドレスを指します。 これらのバイトには、テキストの有効なascci値が含まれています。ヌル終了はありません!

私は、出力の前に(複雑なライブラリやバイトを使用しない)一般的なC++コードのように、いくつかのの簡単な事業におけるある種の文字列型を「ovelaying」を任務としています:

cout << sresult 

を追加しました: なしこれはトラバースする必要がある大きなバッファであるため、バイトをコピーします。

プロトタイプ:すべて

int SpamnEggs(void* pBytes, void* nBytes); 

becomes 

int SpamnEggs(char** pBytes, int* nBytes); 

感謝します。素晴らしい答えとすべての非常に有効です。あなたは生のメモリをコピーして、文字を自分で終了する文字列を追加することができます

+0

あなたは文字列をコピーすることはできません意味重ねることでは?それとも可能なアプローチですか? –

+0

これらの文字列を処理するための新しいクラスを作成するはずですか?または、単に 'std :: string my_string(static_cast (pointer)、length)'を使用できますか? –

+0

はstd:string yesを使用できます。その考えをテストしましょう... –

答えて

2

ポインタと長さからstd :: stringを作成できます。

std::string sResult(pBytes, nBytes); 
std::cout << sResult; 

char*ポインタがpBytesをされると仮定し、そうでなければ、小さなキャストが必要)。

+0

私はVoid * –

+0

+1からプロトタイプを変えることができますので、わかりやすく:) –

+0

それは簡単できれいなアプローチです。しかし、それは、私が思っていた、またはOPによって意図されていないと思ったソースデータをコピーします。 –

2

char* newStr = new char[size + 1]; 
memcpy (newStr, source, size); 
newStr[size] = "\0"; 
cout << newStr; 

メモリをコピーせずに、あなたはメンバーとしてポインタと長さを保持するクラスを作成してのみ印刷するには、ストリーム演算子をオーバーロードすることができますlength文字:

class MyString 
{ 
    void* _pBuf; 
    int _length; 
public: 
    MyString(void* pBuf, int length) 
    { 
     _pBuf = pBuf; 
     _length = length; 
    } 

    friend ostream& operator <<(ostream &os,const MyString& obj); 
}; 


ostream& operator <<(ostream &os,const MyString& obj) 
{ 
    const char* pChar = (const char*)obj._pBuf; 
    for (int i = 0 ; i < obj._length ; i++) 
    { 
     os << pChar[i]; 
    } 
    return os; 
} 

使用例:

char* x = "blablabla"; 
    int length = 3; 
    MyString str(x,length); 
    cout << str; 
+0

申し訳ありませんが、copymemは言及していません。 –

+0

この宿題はありますか?ええ、私は推測させてください、 'strncpy'もありませんか? –

+0

宿題ではなく、クライアントを驚かせないデモアプリのためのシンプルなソウルティションのための長い一日の終わり! –

1

あなたは何をしなければならないでしょうか?

a)charポインタとサイズをカプセル化するいくつかのクラスを作成します。

b)そのクラスのコンテンツをストリームに出力するために、< <演算子を記述します。

編集:Bo Perssonによる応答とは対照的に、これはソースデータのコピーを意味しません。

+0

そのシンプルでラインになる –

+0

私はすべてのインラインのための方法はないと信じています。クラスは非常に軽量で、シフト演算子は1行です(各文字をループして出力するだけです)。それで、実際の呼び出しは次のようになります:cout << MyString(charPointer、length);ルチアンからの解決策を見て、それは私にとって正しいようです。 –

1

どのようにこの(未テスト)コードのようなものについて:

class my_pointer_string 
{ 
    friend std::ostream &operator<<(std::ostream &, const my_pointer_string &); 

public: 
    my_pointer_string(void *ptr, size_t len) 
     : m_pointer(ptr), m_length(len) 
     { } 

private: 
    void *m_pointer; 
    size_t m_length; 
}; 

std::ostream &operator<<(std::ostream &os, const my_pointer_string &str) 
{ 
    char *string = reinterpret_cast<char *>(str.m_pointer); 
    for (size_t i = 0; i < str.m_length; i++) 
     os << *string++; 
    return os; 
} 
+0

偉大だが、シンプルで、数行しかないので、重要なコードから注意をそらさないようにする –

関連する問題