Qt16六进制数据分别提取

nineyole 2011-08-10 09:55:55
大家好,我现在写了一个tcp服务器程序,接收客户端发送的数据
当客户端发送02 AA BB 7C AE BE 7C (其中02表示起始符号,7C就是'|'表示数据分开)请问在服务器端如何分别提取AA BB 和AE BE 并分别保存在不同的QString中呢?

QStringList list1=strmessegae.split("|");
我现在用这个 运行后 当有数据发送时 总是报错啊!
...全文
703 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
s2012shun 2014-04-23
  • 打赏
  • 举报
回复
at()函数,mid()函数也行。不过有个问题,AA BB 等十六进制字节数据容易丢到最高位,变为2A 3B
聆听浪花 2014-04-13
  • 打赏
  • 举报
回复

	QByteArray qba = QByteArray::fromHex("02AABB7CAEBE7C");   //十六进制需用fromHex转成普通字符
	QList<QByteArray> qstrlst = qba.split('|');  //这下可以分割了,如果要转回十六进制再针对每个QByteArray进行toHex
s2012shun 2014-04-09
  • 打赏
  • 举报
回复
用mid函数,
踌伫 2011-11-15
  • 打赏
  • 举报
回复
lefttime 是好人啊 一语点醒梦中人

QStringList args = request.split(" ");
QString command = args.first();
(this->*callback)(player, args.at(1));

request的值为"signup" 然后用了args.at(1) 果断出错了 改成 "signup ." 就ok了

再次谢谢 lefttime
lefttime 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hyl1718 的回复:]

[Quote=引用 14 楼 lefttime 的回复:]
你说的是这个吗?
QStringList list1=strmessegae.split("|");

id=list1.at(0);
voltage=list1.at(1);
temperature=list1.at(2);
humidity=list1.at(3);
sf6=l……
[/Quote]
dbzhang800 也已经提醒你了~`` 你得确保分离后的字段是你所预期的范围! 尤其对于这异步传输的数据~~``
dbzhang800 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hyl1718 的回复:]

[Quote=引用 14 楼 lefttime 的回复:]
你说的是这个吗?
QStringList list1=strmessegae.split("|");

id=list1.at(0);
voltage=list1.at(1);
temperature=list1.at(2);
humidity=list1.at(3);
sf6=l……
[/Quote]
还是回到前面的问题,

1. 你如何确保你的数据中有不少于4个 | 字符!
2. 使用QList的at时,你要确保下标有效!
nineyole 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lefttime 的回复:]
你说的是这个吗?
QStringList list1=strmessegae.split("|");

id=list1.at(0);
voltage=list1.at(1);
temperature=list1.at(2);
humidity=list1.at(3);
sf6=list1.at(4);
smoke=list1.at(5);
lefttime 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hyl1718 的回复:]

[Quote=引用 11 楼 lefttime 的回复:]

不为空啊?strmessage有数据的!
[/Quote]
能否贴下你遍历QStringList的代码?
nineyole 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lefttime 的回复:]

不为空啊?strmessage有数据的!
dbzhang800 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hyl1718 的回复:]

引用 5 楼 lefttime 的回复:
对于二进制流的QByteArray至QString转换可以这么来做:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString strmessegae = codec->toUnicode(message);


大牛 给点建议啊?
卡住了!
[/Quote]
1. 网络接受数据,处理之前你不先确定数据是否有效??
2. 使用QStringList 即 QList<QString> 的 operator[],你不考虑是否越界??
lefttime 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hyl1718 的回复:]

引用 5 楼 lefttime 的回复:
对于二进制流的QByteArray至QString转换可以这么来做:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString strmessegae = codec->toUnicode(message);


大牛 给点建议啊?
卡住了!
[/Quote]
汗, 你提问的速度倒挺快的@@
首先转换是没有问题的, 这里你得判断你的strmessage是否为空先,然后再来分离字符串~``
nineyole 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lefttime 的回复:]
对于二进制流的QByteArray至QString转换可以这么来做:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString strmessegae = codec->toUnicode(message);
[/Quote]

大牛 给点建议啊?
卡住了!
nineyole 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lefttime 的回复:]
对于二进制流的QByteArray至QString转换可以这么来做:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString strmessegae = codec->toUnicode(message);
[/Quote]
按照你这样转换后使用QStringList list1=strmessegae.split("|");还是报错啊!
nineyole 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lefttime 的回复:]
对于二进制流的QByteArray至QString转换可以这么来做:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString strmessegae = codec->toUnicode(message);
[/Quote]

那具体应该怎么用才能将 其中的数据分别提取出来啊?能不能贴个代码?
lefttime 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hyl1718 的回复:]

能不能用正则表达式来用啊
比如:
QString str = "inet addr:10.20.7.236 Bcast:10.20.7.255 Mask:255.255.255.0";
QString pattern("inet addr:(.*) Bcast:(.*) Mask:(.*)");
QRegExp rx(pattern);
int pos ……
[/Quote]


光是分离字符串的话, 没必要用正则~`` - -
nineyole 2011-08-10
  • 打赏
  • 举报
回复
能不能用正则表达式来用啊
比如:
QString str = "inet addr:10.20.7.236 Bcast:10.20.7.255 Mask:255.255.255.0";
QString pattern("inet addr:(.*) Bcast:(.*) Mask:(.*)");
QRegExp rx(pattern);
int pos = str.indexOf(rx);
if ( pos >= 0 )
{
qDebug() << " rx.cap(1) " << rx.cap(1);
qDebug() << " rx.cap(2) " << rx.cap(2);
qDebug() << " rx.cap(3) " << rx.cap(3);
}
但是这样就不能用|分离了,
lefttime 2011-08-10
  • 打赏
  • 举报
回复
对于二进制流的QByteArray至QString转换可以这么来做:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString strmessegae = codec->toUnicode(message);
dbzhang800 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hyl1718 的回复:]

谢谢你的回复。我接受定义的是QByteArray message 这个好像不能直接使用QStringList list1=messeage.split("|")(编译报错);所以我定义了一个QString strmessegae=QString(message);
这是运行报的错误ASSERT failure in QList<T>::at: "index out of range", fil……
[/Quote]
错误消息很明确了,原因你自己考虑把。
lefttime 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hyl1718 的回复:]

谢谢你的回复。我接受定义的是QByteArray message 这个好像不能直接使用QStringList list1=messeage.split("|")(编译报错);所以我定义了一个QString strmessegae=QString(message);
这是运行报的错误ASSERT failure in QList<T>::at: "index out of range", fil……
[/Quote]
这个问题出现在转成QString时拷贝字符串出问题, 导致你的strmessage为空, 而后面的代码应该是遍历了strmessage, 所以导致下标超出范围~``
对于二进制数据的划分, 完全采用QByteArray可以,直接用split返回的同样是QList<QByteArray>~``
nineyole 2011-08-10
  • 打赏
  • 举报
回复
谢谢你的回复。我接受定义的是QByteArray message 这个好像不能直接使用QStringList list1=messeage.split("|")(编译报错);所以我定义了一个QString strmessegae=QString(message);
这是运行报的错误ASSERT failure in QList<T>::at: "index out of range", file c:\Qt\4.7.3\include/QtCore/../../src/corelib/tools/qlist.h, line 456
加载更多回复(2)

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧