2

次のことを試してみると、エラーが発生します。

unsigned char * data = "00000000"; //error: cannot convert const char to unsigned char

私が見逃しているこれを行うための特別な方法はありますか?

アップデート

簡潔にするために、私が達成しようとしていることを説明します。

生のバイナリデータに符号なしの値を使用するStringBufferをC++で作成したいと思います。これを実現するには、unsignedcharが最善の方法のようです。より良い方法があれば?

4

7 に答える 7

2

はい、これを行います:

const char *data = "00000000";

文字列リテラルは、の配列でありchar、ではありませんunsigned char

これを取得する関数に渡す必要がある場合はconst unsigned char *、次のようにキャストする必要があります。

foo(static_cast<const unsigned char *>(data));
于 2011-12-11T21:38:39.843 に答える
2
unsigned char data[] = "00000000";

これはバッファにコピー "00000000"されます。これはunsigned char[]、バッファが文字列リテラルのように読み取り専用ではないことも意味します。

あなたがそれをしている方法がうまくいかない理由は、あなたが( )文字列リテラル( )を指し dataているので、データはタイプでなければなりません。次のように、明示的にキャストせずにそれを行うことはできません。signedchar[]char*"00000000"(unsigned char*)"00000000"

文字列リテラルは明示的に型ではないことに注意してください。ただし、文字列リテラルをそのように扱わずに変更しようとすると、未定義の動作発生します。多くの場合、アクセス違反エラーになります。constchar[]

于 2011-12-11T21:42:16.023 に答える
2

あなたには多くの方法があります。1つは書くことです:

const unsigned char *data = (const unsigned char *)"00000000";

もう1つ、より推奨されるのは、次のように宣言するdataことです。

const char *data = "00000000";

そして、それを関数に渡すと、次のようになります。

myFunc((const unsigned char *)data);

unsigned char一般に、の文字列は異常であることに注意してください。unsigned charsの配列がより一般的ですが、文字列( "00000000")で初期化することはありません。

アップデートへの対応

unsigned char生のバイナリデータが必要な場合は、最初に、の代わりに、またはなどのより大きなコンテナを使用する方がよいことをお伝えしlong intますlong long。これは、バイナリリテラル(配列)で操作を実行すると、操作が4または8削減され、速度が向上するためです。

次に、クラスでバイナリ値を表現する場合は、文字列ではなく、個々の値で初期化します。あなたの場合は次のようになります。

unsigned char data[] = {0x30, 0x30, 0x30, 0x30, /* etc */}

バイナリをバイナリとして格納していると仮定していることに注意してください。つまり、unsignedcharで8ビットを取得します。一方、0と1の文字列のようにバイナリを意味する場合、これは実際には良い考えではありませんが、いずれにしても、実際には必要unsigned charではなく、char十分です。

于 2011-12-11T21:44:58.433 に答える
2
std::vector<unsigned char> data(8, '0');

または、データが均一でない場合:

auto & arr = "abcdefg";
std::vector<unsigned char> data(arr, arr + sizeof(arr) - 1);

または、リテラルから直接割り当てることができます。

std::basic_string<unsigned char> data = (const unsigned char *)"abcdefg";
于 2011-12-11T21:52:28.877 に答える
1

unsignedcharへのポインタに文字列値を割り当てようとしています。それをしてはいけない。ポインタがある場合は、メモリアドレスまたはNULLのみを割り当てることができます。

代わりにconstcharを使用してください。

于 2011-12-11T21:39:32.313 に答える
1

ターゲット変数は。へのポインタunsigned charです。「00000000」は文字列リテラルです。タイプはconst char[9]です。ここには2つのタイプの不一致があります。1つはそれでunsigned charありchar、異なるタイプです。修飾子の欠如constも大きな問題です。

あなたはこれを行うことができます:

unsigned char * data = (unsigned char *)"00000000";

しかし、これはあなたがすべきではないことです。これまで。文字列リテラルの恒常性を捨てると、いつか大きな問題に直面するでしょう。

以下は少し良いですが、厳密に言えば、それはまだ指定されていない動作です(おそらく未定義の動作です。標準にあるものを追いかけたくありません):

const unsigned char * data = (const unsigned char *)"00000000";

ここでは、定数を保持していますが、ポインタの種類をからchar*に変更していますunsigned char*

于 2011-12-11T21:52:42.633 に答える
0

@オランダ-

unsigned char * data = "00000000"; 

明確にしていることがわからない非常に重要な点の1つは、文字列 "00000000 \ 0"(区切り文字を含む9バイト)が読み取り専用メモリに含まれている可能性があることです(プラットフォームによって異なります)。

つまり、変数( "data")をこのように定義し、それを "data"を変更しようとする可能性のある関数に渡した場合、アクセス違反が発生する可能性があります。

解決策は次のとおりです。

1)「constchar *」として宣言します(他の人がすでに言っているように)

  ... and ...

2)「constchar *」として扱います(内容を変更したり、内容を変更する可能性のある関数に渡したりしないでください)。

于 2011-12-11T21:47:54.490 に答える