找回密码
 立即注册
收起左侧

关于字符串转化成16进制的问题

19
回复
18369
查看
[复制链接]
累计签到:256 天
连续签到:1 天
来源: 2015-5-27 12:15:48 显示全部楼层 |阅读模式
10Qter豆
本帖最后由 z55716368 于 2015-5-27 15:55 编辑

首先 好久不见 上周回学校做毕设和答辩了 感觉论文在修改一下就过了!
然后 昨天回公司开始工作,现在在写解包和封包程序,现在遇到困难了,关于从Qt界面读取字符串后,传给我,我封成16进制的数组进行封包。"你好","QWXUTL","1234"这几种应该怎么转呢?
大神过来 谢谢啦!

谁能给我说2个方法,可以将中文字符串转成16进制封进几个quint8数据包中,然后又将这个数据包解出来 显示中文

最佳答案

查看完整内容

QString有个函数是QString::toLocal8Bit(), 输出是QByteArray,在输出成char,就是原始的16进制utf8编码。 接收的逆序变回QString就行。
回复

使用道具 举报

尚未签到

2015-5-27 12:15:49 显示全部楼层
QString有个函数是QString::toLocal8Bit(),  输出是QByteArray,在输出成char,就是原始的16进制utf8编码。

接收的逆序变回QString就行。
回复

使用道具 举报

尚未签到

2015-5-27 14:54:40 显示全部楼层
utf8的编码不就是16进制么
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-27 14:58:28 显示全部楼层
Joey_Chan 发表于 2015-5-27 14:54
utf8的编码不就是16进制么

就是这种
void send(QString hade){
    quint8 data[];
    data[0] = 0x01;
    data[1] = 0x02;//标识开始
    //然后通过程序 将传进来的QString,如“你好”,“nihao”,“124562”这种字符串 都能转成16进制存到data里面,
    //....
   
    data[n] = 0x0f;//标识结束
}
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-27 18:38:46 显示全部楼层
如果可以 麻烦你给一个具体点的代码我学习学习 谢谢
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-28 08:47:15 显示全部楼层
本帖最后由 z55716368 于 2015-5-28 08:48 编辑

关于这个转换 已经找到解决方法
给大家分享一下
    QString mm = "中文";
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QByteArray ending = codec->fromUnicode(mm);
    quint8 datae[6];
    for(int j=0;j<ending.length();j++) {
        //将16进制装入datae中
        datae[j] = ending[j];
        qDebug("%x",datae[j]);
    }
    int len = sizeof(datae);
    char *sz = new char[len];
    for(int i=0;i<len;i++) {
        sz = datae;
        qDebug("%x",(sz&0xff));
    }
    QString ss(sz);
    qDebug() << ss;

PS:len以前的部分是QString转16进制,编码使用的是UTF-8当然你可以自己设置所需要的编码,然后len开始是将quint8数组中装的16进制转回QString


回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-28 08:49:50 显示全部楼层
本帖最后由 z55716368 于 2015-5-28 08:51 编辑

然后转回的部分其实Qt有已经封好的函数调用
//QbyteArray转字符串
    //QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextDecoder *decoder = codec->makeDecoder();
    QString string;
    string += decoder->toUnicode(ending);
    delete decoder;
string中就是需要的中文了,我的项目需要用quint8 所以中间转了一下
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-28 11:12:22 显示全部楼层
Joey_Chan 发表于 2015-5-27 14:54
utf8的编码不就是16进制么

你好 有我一个问题 我的quint8数组里面装的是0X02这种16进制,如果我用int a = data[5];来装这一位的值 那么a里面到底是什么 是十进制还是十六进制
回复

使用道具 举报

累计签到:24 天
连续签到:1 天
2015-5-28 11:19:34 显示全部楼层

1

本帖最后由 wylnii 于 2015-5-28 11:22 编辑

楼主的有问题。研究了下,发现个简单的方法。
    QString mm = "中文abc123";
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QByteArray ending = mm.toLatin1();
    quint8 datae[ending.length()];
    for(int j=0;j<ending.length();j++)
    {
        //将16进制装入datae中
        datae[j] = ending[j];
        qDebug("%X",datae[j]);
    }
    QString string;
    string = codec->toUnicode(ending);
    qDebug() << string;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-28 13:13:42 显示全部楼层
wylnii 发表于 2015-5-28 11:19
楼主的有问题。研究了下,发现个简单的方法。
    QString mm = "中文abc123";
    QTextCodec *codec = QT ...

实际上我传进函数的只是个指针 现在不知道整个数据包的长度 有些蒙了
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-28 13:25:24 显示全部楼层
wylnii 发表于 2015-5-28 11:19
楼主的有问题。研究了下,发现个简单的方法。
    QString mm = "中文abc123";
    QTextCodec *codec = QT ...

你的回转还是用的QByteArray啊,换成quint8 就不行了?
回复

使用道具 举报

尚未签到

2015-5-28 18:02:34 显示全部楼层
z55716368 发表于 2015-5-28 11:12
你好 有我一个问题 我的quint8数组里面装的是0X02这种16进制,如果我用int a = data[5];来装这一位的值  ...

这我没研究,你qdebug输出或者调试模式是能看出来的
回复

使用道具 举报

累计签到:24 天
连续签到:1 天
2015-5-28 20:39:19 显示全部楼层
z55716368 发表于 2015-5-28 13:25
你的回转还是用的QByteArray啊,换成quint8 就不行了?

QByteArray可以转quint8啊










回复

使用道具 举报

累计签到:24 天
连续签到:1 天
2015-5-28 21:14:29 显示全部楼层
wylnii 发表于 2015-5-28 20:39
QByteArray可以转quint8啊

    string = codec->toUnicode((char*)data);
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-29 08:39:27 显示全部楼层
wylnii 发表于 2015-5-28 21:14
string = codec->toUnicode((char*)data);

对了  我想知道quint8和char *有啥不同? 它是个8位的吧?
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-29 08:40:00 显示全部楼层
Joey_Chan 发表于 2015-5-28 18:02
这我没研究,你qdebug输出或者调试模式是能看出来的

感觉qDebug() 会将这些16进制自动弄成10进制输出 有时候搞得我很混乱
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-29 14:18:09 显示全部楼层
z55716368 发表于 2015-5-29 08:39
对了  我想知道quint8和char *有啥不同? 它是个8位的吧?

还有 你开始用的mm.tolain1(),是直接将QString转成ascii放到QByteArray里面么?
回复

使用道具 举报

累计签到:24 天
连续签到:1 天
2015-5-29 15:29:38 显示全部楼层
z55716368 发表于 2015-5-29 08:39
对了  我想知道quint8和char *有啥不同? 它是个8位的吧?

quint8就是unsigned char                                                                 
回复

使用道具 举报

累计签到:24 天
连续签到:1 天
2015-5-29 15:30:53 显示全部楼层
z55716368 发表于 2015-5-29 14:18
还有 你开始用的mm.tolain1(),是直接将QString转成ascii放到QByteArray里面么?

tolatin1和toAscii等价,Qt5中已经弃用toAscii了
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-5-29 17:00:12 显示全部楼层
wylnii 发表于 2015-5-29 15:30
tolatin1和toAscii等价,Qt5中已经弃用toAscii了

下午做转ascii的时候 发现很难搞,主要是不能判断变量中到底是不是储存的ascii 用qDebug("%x",mm)打印可以打印出对应的16进制,但是用调试器查看,在遇到字符串的转码的时候,储存的是负数,我就不知道如果把这个数组传下去或者是QByteArray传下去会不会出错,下面的打印机是直接识别ascii的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了