web-dev-qa-db-ja.com

char *をuint8_tに変換します

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にすることができます。

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

7
Evans Belloeil

文字列は整数ですか?例えば。 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
7
carmellose

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 *データのどこかにフロートがあると思われる場合は、私たちが支援する前に行うべき説明がたくさんあります:/

1
Andy Newman

char *はポインタであり、1文字ではありません。あなたが望むキャラクターを指すことが可能です。

uint8_tは符号なしですが、ほとんどのシステムではcharと同じサイズであり、値をキャストするだけで済みます。

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

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

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

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

0
CashCow

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 )
0
user707779