十六进制到字符串转换C++/C/Qt?

roc*_*oll 3 c++ qt

我正在与以十六进制格式发送数据的外部设备连接.它是形式

> %abcdefg,+xxx.x,T,+yy.yy,T,+zz.zz,T,A*hhCRLF
Run Code Online (Sandbox Code Playgroud)
  • CR LF是回车换行
  • HH->校验
  • %abcdefg - >标题

上面数据包中的每个字符都以十六进制表示形式发送(xx,yy,abcd等被实际数字替换).问题出在我的最后,我把它存储在一个const char*中,在隐式转换期间,校验和说0x05转换为\ 0x05.这里\ 0为空字符终止我的字符串.当它不是时,这被认为是不正确的帧.虽然我可以将实现更改为处理原始字节(以十六进制形式),但我只是想知道是否还有另一种方法,因为它极大地简化了字节处理.这就是程序员的意图.

另外在cutecom(在LINUX RHEL 4上)我检查了串口上的数据,我们也注意到\0x05了校验和而不是5.请注意,用于存储我正在使用的传入数据

//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
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

ufu*_*gun 12

QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!" 
Run Code Online (Sandbox Code Playgroud)


sbi*_*sbi 8

如果你0x05的转换为char '\x05',那么你没有十六进制值(只有你有数字作为字符串才有意义),但是二进制值.在C和C++中,a char基本上只是另一种整数类型,几乎没有添加魔法.因此,如果您有a 5并将其分配给a char,那么您获得的是系统编码定义为第五个字符的任何字符.(在ASCII中,这将是ENQchar,无论现在意味着什么.)

如果您想要的是char '5',那么您需要将二进制值转换为其字符串表示形式.在C++中,这通常使用流完成:

const char ch = 5; // '\0x5'
std::ostringstream oss;
oss << static_cast<int>(ch);
const std::string& str = oss.str(); // str now contains "5"
Run Code Online (Sandbox Code Playgroud)

当然,C std库也提供了这种转换的功能.如果流媒体对你来说太慢了,你可以尝试一下.

  • 一个问题和答案已收到10,000次观看,没有一个单独的投票答案.到现在. (2认同)