【发布时间】:2010-11-18 12:37:50
【问题描述】:
我正在与一个以十六进制格式发送数据的外部设备连接。它的形式
> %abcdefg,+xxx.x,T,+yy.yy,T,+zz.zz,T,A*hhCRLF
- 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
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();
}
【问题讨论】:
-
对不起,大家注意到代码标签中的编码
-
你想得到什么作为输出?源数组
0x00, 0x00, 0x03, 0x84, 0x78, 0x9c, 0x3b, 0x76, 0xec, 0x18, 0xc3, 0x31, 0x0a, 0xf1, 0xcc, 0x99应该打印为 ... ? -
@Jla3ep 我在串行端口上获取数据,从那里我在 unsigned char[FIXED SIZE] 缓冲区中读取数据。如我的帖子中所述,我将其转换为字符串。我正在研究的是一种消除接收到的数据中的 \0 字符或不会隐式转换为在十六进制值之前添加 \0 的转换的方法。
-
是的,我明白了,但是您能否展示您所期望的实际数据和结果?在这一点上,我看不到如何从输入数据中获取 '\0'。符号 '\' 有 0x5C 代码,但我在你
mydata[]数组中看不到它。 -
@Jla3ep。好的,这是十六进制的示例数据单个字符,因为设备正在发送 49,46,50,4a,4b,51,52,43,2c,31,32,33,2e,34,2c,54,2c,41 ,2c,2b,33,30,2e,30,30,2c,41,2c,2d,33,30,2e,30,30,2c,41,2a,05,0d,0a 倒数第三个字节 05 是产生问题的校验和。我将它收集在 unsigned char 缓冲区中,并通过将其转换为 const char* 来将此缓冲区转换为 QString。