プロが教えるわが家の防犯対策術!

いつもお世話になっています。

MFCのCStringクラスとCByteArrayを相互に変換したいと考えているのですが、どうもうまくいきません。

文字コードはユニコードを想定しています。

======================================================
CByteArray data;
CString cs1 = _T("あいうえお");
CString cs2;

LPBYTE lpByte = (LPBYTE)(LPCTSTR)cs1.GetBuffer();
data.SetSize(cs1.GetLength() * sizeof(TCHAR));
CopyMemory(data.GetData(), lpByte, data.GetSize());
cs1.ReleaseBuffer();
cs2 = (LPCTSTR)data.GetData();
AfxMessageBox(cs2);
======================================================
(現在の出力状況)
あいうえお・・・・

文字は正しく出力されますが、語尾に文字化けしたようなものがつきます。
他に良い方法があればよろしくお願いします。

A 回答 (1件)

MFCのバージョンが不明ですが……



>文字は正しく出力されますが、語尾に文字化けしたようなものがつきます。

一般的な文字列では、終端に'\0'が必要ですが、その分の領域はCByteArrayのdataにあるのでしょうか?
>data.SetSize(cs1.GetLength() * sizeof(TCHAR));
『文字数』*sizeof(TCHAR)で、'\0'分が無いように見えますが……。
そんなワケでdtaに入っているのものは、LPCTSTRで示す「文字列」とは見なされないでしょうから…
CStringへのコピー時には『'\0'が見つかるまで』の領域をコピーする動作をするでしょう。
さて、'\0'が見つかるのはいったいドコでしょう……。

この回答への補足

返信ありがとうございます。

MFCのバージョンはVisual C++ 2008を使用しているのでMFC9.0です。

補足日時:2009/12/15 09:14
    • good
    • 0
この回答へのお礼

自己解決しました。
改行文字はあまり関係なかったみたいです。

(補足)
void CStoCBA(CString &cs, CByteArray &data)
{
LPBYTE lpData;
int nLength;

nLength = cs.GetLength();
lpData = reinterpret_cast<LPBYTE>(static_cast<LPTSTR>(cs.GetBuffer()));
data.SetSize(cs.GetLength() * sizeof(TCHAR));
CopyMemory(data.GetData(), lpData, data.GetSize());
cs.ReleaseBuffer();
data.FreeExtra();
}

void CBAtoCS(CByteArray &data, CString &cs)
{
cs.SetString(reinterpret_cast<LPTSTR>(data.GetData()), data.GetSize() / sizeof(TCHAR));
}


CByteArray data;
CString cs1 = _T("あいうえお");
CString cs2;

// CStringからCByteArrayに変換
CStoCBA(cs1, data);
AfxMessageBox(cs1);

// CByteArrayからCStringに変換
CBAtoCS(data, cs2);
AfxMessageBox(cs2);

お礼日時:2009/12/15 09:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!