
いつもお世話になっています。
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件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
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);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
Microsoft365で作ったword文書...
-
プログラムについての質問です...
-
VBAのExecメソッドで画面を非表...
-
ListViewの複数選択について
-
4種類(A4縦、A4横、A3縦、A3横)のヘ...
-
【VBA】PDFを2in1で出力したいです
-
coutで出力した文字を消去する...
-
4Kの外部モニターに出力すると...
-
COBOLのMOVEで桁数が異なる場合
-
Accessのテーブルからcsv出力す...
-
真空管 300 B の前段について
-
海外の110Vの電気製品を日本で...
-
ACCESS クエリ→フォーム...
-
フォートランで出力をタブ区切...
-
ADO.NETのSqlDataReaderをADOの...
-
無線とかアンテナに関しの質問...
-
スマホのバッテリー消費につい...
-
VBAでテキスト出力時のスペース...
-
スマホ充電器購入にあたり
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
Accessのテーブルからcsv出力す...
-
FLEXSOLARパネルからAmazonで買...
-
真空管 300 B の前段について
-
cout と cerrの違い
-
printfとputcharの違いは
-
スマホ充電器購入にあたり
-
PD充電器について
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
Windows Formアプリからコンソ...
-
CrystalReportの文字列の折返し...
-
C#でアクセス権限の取得方法が...
-
coutで出力した文字を消去する...
-
【UWSC】WEBページ中の特定文字...
-
KEYENCEのシーケンスプログラム...
-
CRC16計算について
-
標準出力の上書き
おすすめ情報