- 締切済み
CStringとCByteArrayの変換
いつもお世話になっています。 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); ====================================================== (現在の出力状況) あいうえお・・・・ 文字は正しく出力されますが、語尾に文字化けしたようなものがつきます。 他に良い方法があればよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
MFCのバージョンが不明ですが…… >文字は正しく出力されますが、語尾に文字化けしたようなものがつきます。 一般的な文字列では、終端に'\0'が必要ですが、その分の領域はCByteArrayのdataにあるのでしょうか? >data.SetSize(cs1.GetLength() * sizeof(TCHAR)); 『文字数』*sizeof(TCHAR)で、'\0'分が無いように見えますが……。 そんなワケでdtaに入っているのものは、LPCTSTRで示す「文字列」とは見なされないでしょうから… CStringへのコピー時には『'\0'が見つかるまで』の領域をコピーする動作をするでしょう。 さて、'\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);
補足
返信ありがとうございます。 MFCのバージョンはVisual C++ 2008を使用しているのでMFC9.0です。