質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

5831閲覧

char配列をCStringに変換

退会済みユーザー

退会済みユーザー

総合スコア0

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/03 23:19

編集2020/10/04 04:38

バイナリデータ{ 4, 5, 0, 6, 7, }をCStringにしたいのですが、5までしか変換できません。
途中に入っている0のせいだと思うのですが、0も含めて変換したい場合はどうすればいいのでしょうか?
以下のソースはバイナリデータをCStringとstringで相互変換しようとしています。

c++

1 char n[] = { 4, 5, 0, 6, 7, }; 2 int size = sizeof(n); 3 CString cstring(n, size); // charから直接変換 失敗 4 std::string str(n, n + size); // charから直接変換 成功 5 6 // string -> CString変換 7 CString str_a; 8 str_a = CA2W{ str.c_str(), CP_UTF8 }; 9 10 // CString -> string変換1 11 std::string str_b{ CW2A{ str_a.GetBuffer(5), CP_UTF8 } }; 12 13 // CString -> string変換2 14 std::string str_c{ CW2A{ cstring.GetBuffer(5), CP_UTF8 } }; 15 16 cstring.ReleaseBuffer(); 17 str_a.ReleaseBuffer();

コメントを受けて少し前進しました。0以降も取得変換できたものの
途中から 0x4 が、 0x04, 0x00と2バイトに。
最後のstd::string strに変換する際は、1バイトに戻ってほしいのですが、

char n[] = { 4, 5, 0, 6, 7, }; int size = sizeof(n); CString cstring(n, size); // charから直接変換 int nByteNum= cstring.GetLength() * sizeof(TCHAR); // CString -> string変換 char* pref = (char*)cstring.GetBuffer(nByteNum); std::string str(pref, pref+nByteNum);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/10/04 02:46

std::stringとCString相互の変換を問題にしているのか、それともUTF8への変換を問題にしているのか、どちらなのでしょうか。std::stringもCStringも、内部では'\0'を含めてすべてのデータを収容できます。
退会済みユーザー

退会済みユーザー

2020/10/04 03:31

std::stringとCString相互の変換で、別にUTF8でなくてもいいです。
guest

回答2

0

ベストアンサー

途中から 0x4 が、 0x04, 0x00と2バイトに。

構成プロパティ-詳細-文字セットUnicode文字セットを使用するの設定でコンパイルしているのでしょう。
あなたもTCHARと書いている通り、UNICODEビルド時はCStringの要素はWCHAR(wchar_t)つまり2バイトです。

構成プロパティ-詳細-文字セットマルチバイト文字セットを使用するの設定でコンパイルするか、CStringAを使用して以下のように書き換えて下さい。

diff

1 char n[] = { 4, 5, 0, 6, 7, }; 2 int size = sizeof(n); 3- CString cstring(n, size); // charから直接変換 4+ CtringA cstring(n, size); // charから直接変換 5- int nByteNum = cstring.GetLength() * sizeof(TCHAR); 6+ int nByteNum = cstring.GetLength(); 7 8 // CString -> string変換 9 char* pref = (char*)cstring.GetBuffer(nByteNum); 10 std::string str(pref, pref + nByteNum);

以下のようになっています。

C++

1typedef CStringT< wchar_t, StrTraitATL< wchar_t, ChTraitsCRT< wchar_t > > > CAtlStringW; 2typedef CStringT< char, StrTraitATL< char, ChTraitsCRT< char > > > CAtlStringA; 3typedef CStringT< TCHAR, StrTraitATL< TCHAR, ChTraitsCRT< TCHAR > > > CAtlString; 4typedef CAtlStringW CStringW; 5typedef CAtlStringA CStringA; 6typedef CAtlString CString;

投稿2020/10/04 06:44

編集2020/10/04 06:46
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/04 09:48

ありがとうございます! CStringAでうまくいきました。 使ってるVisualStudioには、文字セットの項目が無かったのでそちらは試せませんでしたが、CStringAで使ってみます。
SHOMI

2020/10/04 16:00

TCHARがあって文字セットの項目が無いとはありえないと思いますが… ソリューションエクスプローラーからプロジェクトを右クリックして"プロパティ"ですよ。
guest

0

ここが参考になるかも?

CString型にバイナリデータはセットできますか?
https://teratail.com/questions/228404

投稿2020/10/04 01:31

amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/04 04:03

ありがとうございます。 参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問