私は、16進形式でデータを送信している外部デバイスと接続しています。これは16進数からストリングへの変換C++/C/Qt?
> %abcdefg,+xxx.x,T,+yy.yy,T,+zz.zz,T,A*hhCRLF
- CR LFは、キャリッジリターンラインフィードである形態である
- hh->チェックサム
- % ABCDEFG - >上記パケット内の各文字をとして送信さ
ヘッダ(xx、yy、abcdなどは実際の数字に置き換えられます)。問題は私の最後でconst char *に格納され、暗黙の変換中にチェックサムは0x05が\ 0x05に変換されると言う。ここで\ 0はヌル文字で、私の文字列は終了します。これは正しくないフレームとして認識されます。実装を生のバイト(16進形式で)を処理するように変更することはできますが、別の方法があるかどうかは、バイトの処理を大幅に簡素化するためです。そして、これはプログラマーのためのものです。
また、私はシリアルポートのデータをチェックしました。また、チェックサムの代わりに\0x05
に気付きました。着信データを格納するために、私は
//store data from serial here
unsigned char Buffer[SIZE];
//convert to a QString, here is where problem arises
QString str((const char*)Buffer); of \0
のQStringを使用していますことを 注意はQtのの「文字列」クローンです。ライブラリはここでも問題ではありませんが、STLも使用できますが、C++の文字列ライブラリも同じことをしています。誰かがこのタイプの実験を試みたことがありますか?あなたの意見を共有してください。
#include <iostream>
#include <string>
#include <QString>
#include <QApplication>
#include <QByteArray>
using std::cout;
using std::string;
using std::endl;
int main(int argc,char* argv[])
{
QApplication app(argc,argv);
int x = 0x05;
const char mydata[] = {
0x00, 0x00, 0x03, 0x84, 0x78, 0x9c, 0x3b, 0x76,
0xec, 0x18, 0xc3, 0x31, 0x0a, 0xf1, 0xcc, 0x99};
QByteArray data = QByteArray::fromRawData(mydata, sizeof(mydata));
printf("Hello %s\n",data.data());
string str("Hello ");
unsigned char ch[]={22,5,6,7,4};
QString s((const char*)ch);
qDebug("Hello %s",qPrintable(s));
cout << str << x ;
cout << "\nHello I am \0x05";
cout << "\nHello I am " << "0x05";
return app.exec();
}
コードタグにエンコードする際にご注意ください。 – rocknroll
出力として取得しようとしていますか?ソース配列 '0x00、0x00、0x03、0x84、0x78、0x9c、0x3b、0x76、0xec、0x18、0xc3、0x31、0x0a、0xf1、0xcc、0x99' –
@ Jla3ep 私はシリアルポートのデータを、私がunsigned char [FIXED SIZE]バッファで読み込んだ場所から取得します。これは私の記事で述べたように文字列に変換します。私が見ているのは、受け取ったデータの\ 0文字や、16進値の前に\ 0を前に付けて暗黙的に変換しない変換を取り除く方法です。 – rocknroll