11

CAN プロトコルを介してメッセージを転送します。

そのためには、CAN メッセージに uint8_t type のデータが必要です。したがって、char* を uint8_t に変換する必要があります。このサイトでの調査により、次のコードを生成します。

    char* bufferSlidePressure = ui->canDataModifiableTableWidget->item(6,3)->text().toUtf8().data();//My char*

    /* Conversion */
    uint8_t slidePressure [8];
    sscanf(bufferSlidePressure,"%c",
        &slidePressure[0]);

ご覧のとおり、私char*は に収まる必要がありsliderPressure[0]ます。

私の問題は、コンパイル中にエラーが発生しなくても、slidePressure のデータが完全に正しくないことです。確かに、私は a でそれをテストし、私char* = 0は未知の文字を持っています...だから、問題は変換から来ているに違いないと思います.

私のデータはBool, Uchar, Ushort and float.

ご協力いただきありがとうございます。

4

4 に答える 4

12

あなたの文字列は整数ですか?例えばchar* bufferSlidePressure = "123";

もしそうなら、私は単純に次のようにします:

uint8_t slidePressure = (uint8_t)atoi(bufferSlidePressure);

または、配列に入れる必要がある場合:

slidePressure[0] = (uint8_t)atoi(bufferSlidePressure);

編集:あなたのコメントに続いて、あなたのデータが何かである可能性がある場合、それを新しいデータ型のバッファにコピーする必要があると思います。例:

/* in case you'd expect a float*/
float slidePressure;
memcpy(&slidePressure, bufferSlidePressure, sizeof(float));

/* in case you'd expect a bool*/
bool isSlidePressure;
memcpy(&isSlidePressure, bufferSlidePressure, sizeof(bool));

/*same thing for uint8_t, etc */

/* in case you'd expect char buffer, just a byte to byte copy */
char * slidePressure = new char[ size ]; // or a stack buffer 
memcpy(slidePressure, (const char*)bufferSlidePressure, size ); // no sizeof, since sizeof(char)=1
于 2014-08-18T10:19:00.973 に答える
2

uint8_t は 8 ビットのメモリで、0 から 255 までの値を格納できます。

char はおそらく 8 ビットのメモリです

char * はおそらく、char があるメモリ内の別の場所のアドレスを含む 32 ビットまたは 64 ビットのメモリです。

まず、メモリ アドレス (char *) を uint8 に入れようとしないでください - それが指すものを入れてください:

char from;
char * pfrom = &from;
uint8_t to;
to = *pfrom;

次に、実際に何をしようとしているのかを考えてみましょう...これはあまり意味がありません。たとえば、float はおそらく 32 ビットまたは 64 ビットのメモリです。char * データのどこかに float があると思われる場合は、私たちがお手伝いできる前に、多くの説明を行う必要があります:/

于 2014-08-18T13:56:36.253 に答える
0

char *はポインタであり、1 文字ではありません。ご希望のキャラクターを指している可能性があります。

uint8_tは符号なしですが、ほとんどのシステムでは a と同じサイズになり、char単純に値をキャストできます。

関数が返すもののメモリと有効期間を管理する必要がある場合があります。これは、特に toUtf8() がデータ用のメモリを作成する必要がある場合は、vector< unsigned char>ではなく関数の戻り値の型として実行できます。char *

あなたの質問は完全にあいまいです。

ui->canDataModifiableTableWidget->item(6,3)->text().toUtf8().data();

それは多くのカスケード呼び出しです。それらが何をしているのか、またそれらがあなたのものであるかどうかはわかりません。危険そうです。

于 2014-08-18T10:20:04.797 に答える
-1

C++ の方法でより安全な例

char* bufferSlidePressure = "123";
std::string buffer(bufferSlidePressure);
std::stringstream stream;

stream << str;
int n = 0;

// convert to int
if (!(stream >> n)){
    //could not convert
}

また、ブーストが利用可能な場合

int n = boost::lexical_cast<int>( str )
于 2014-08-18T10:34:47.090 に答える