CANプロトコルを介したメッセージを転送します。
これを行うには、CANメッセージにはuint8_tタイプのデータが必要です。したがって、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のデータは完全に正しくないです。確かに、私はchar* = 0
を使用してテストし、不明な文字を取得しました...したがって、問題は変換に起因すると考えられます。
私のデータはBool, Uchar, Ushort and float
にすることができます。
ご協力いただきありがとうございます。
文字列は整数ですか?例えば。 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
uint8_tは8ビットのメモリで、0〜255の値を格納できます
charはおそらく8ビットのメモリです
char *は、32ビットまたは64ビットのメモリであり、charが存在するメモリ内の別の場所のアドレスが含まれています。
最初に、メモリアドレス(char *)をuint8に入れないようにしてください-それが指すものを入れてください。
char from;
char * pfrom = &from;
uint8_t to;
to = *pfrom;
次に、実際に何をしようとしているのかを調べます。これはあまり意味がありません。たとえば、floatはおそらく32ビットまたは64ビットのメモリです。 char *データのどこかにフロートがあると思われる場合は、私たちが支援する前に行うべき説明がたくさんあります:/
char *
はポインタであり、1文字ではありません。あなたが望むキャラクターを指すことが可能です。
uint8_t
は符号なしですが、ほとんどのシステムではchar
と同じサイズであり、値をキャストするだけで済みます。
関数が返すもののメモリと寿命を管理する必要があるかもしれません。これは、特にtoUtf8()がデータ用のメモリを作成する必要がある場合、vector< unsigned char>
ではなくchar *
を関数の戻り値の型として使用して行うことができます。
あなたの質問は完全にあいまいです。
ui->canDataModifiableTableWidget->item(6,3)->text().toUtf8().data();
それはカスケード呼び出しの多くです。私達はそれらのどれが何をしているか、そしてそれらがあなたのものであるかどうかを知りません。危険そうです。
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 )