いつもお世話になっています。
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で質問しましょう!
似たような質問が見つかりました
- 数学 ラプラス変換について 3 2022/10/13 22:18
- Illustrator(イラストレーター) イラストレーターCSで、ロゴをスコープ型に修正する方法のお尋ねです 1 2022/10/13 17:46
- その他(プログラミング・Web制作) micropythonコード 修正 1 2023/06/13 17:22
- その他(プログラミング・Web制作) micropython コードについて 2 2023/06/14 13:13
- Visual Basic(VBA) Selenium Basicの件 5 2023/04/10 20:55
- 環境学・エコロジー これらについて簡単に教えてもらえるとありがたいです 1.土壌中のCsが時間が経つと安定する理由 2. 1 2023/06/04 18:43
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- スポーツサイクル SRAM Forceの10Sスプロケット(PG-1070 11-28T)にSHIMANO ULTEG 2 2022/04/23 10:30
- その他(プログラミング・Web制作) このpythonコードの意味教えて下さい! 2 2022/08/26 00:52
- ドライブ・ストレージ MOドライブ(CS-M230PA)に合う、SCSIからUSBへ変換するコネクタを教えてください。 2 2022/05/22 12:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
AIに回答させるって
-
プログラムについての質問です...
-
VBAでテキスト出力時のスペース...
-
VBAで有効数字の設定
-
LaTeX:tableofcontentsによる目...
-
アクセスでエクセルに出力する...
-
携帯の液晶画像をパソコンに出...
-
Accessのテーブルからcsv出力す...
-
coutで出力した文字を消去する...
-
4Kの外部モニターに出力すると...
-
C#でアクセス権限の取得方法が...
-
改行の仕方
-
C言語の標準関数の引数の順番に...
-
COBOLのMOVEで桁数が異なる場合
-
KEYENCEのシーケンスプログラム...
-
printfの書式%.*s
-
OBS配信すると、マイクが途切れ...
-
wsprintfで浮動小数を扱うには?
-
Excel VBAで値を変えながら、pd...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
コンセントの電力は入力と出力...
-
MMDでavi出力が出来ない
-
OBS配信すると、マイクが途切れ...
-
VBAでテキスト出力時のスペース...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
ACCESS クエリ→フォーム...
-
アクセスでエクセルに出力する...
-
VBAのExecメソッドで画面を非表...
-
テキストファイルから特定の文...
-
Windows11対応の3入力1出力 USB...
-
VBAで有効数字の設定
-
スマホのバッテリー消費につい...
-
Excel VBAで値を変えながら、pd...
-
NTTのホームゲートウェイとOCN...
-
定格冷房能力(出力)とは 定格...
-
プログラムについての質問です...
-
PS5をMacBookProに出力したいの...
おすすめ情報