【问题标题】:Get imei from QByteArray in hex以十六进制从 QByteArray 获取 imei
【发布时间】:2019-04-13 22:37:48
【问题描述】:

我正在开发一个桌面应用程序,它从服务器接收字节格式的帧。我有设备的 imei 在收到的帧中发送这些帧。

我尝试添加到 long long 变量,每个字节都有相应的左移 (56, 48, 40..., 0),但数字比 40 bits 长,所以它不起作用。

我只想把它放在一个文本框上,所以QString 格式就足够了,但我对 C++ 一点信心都没有,我不知道我怎么能得到它。

例如,这个 imei:352353222952355 将在这样的框架中接收:[0x00, 0x01, 0x40, 0x76, 0xA0, 0xB0, 0x85, 0xA3],我在我的QByteArray 中有。每次我尝试使用 qDebug() 打印该变量时,我都会得到十六进制表示(“\x00\0x....”)。我想得到的是我在本段第一行输入的数字。

如何在QString 中转换为十进制表示形式?

编辑: 我想在@Peter 的帮助下添加一些与我正在运行的测试相关的信息

这就是我打印 QByteArray 得到的结果:

qDebug() << imei;
"\x00\x01@v\x98[\xD7\xAF"

如果我将该 imei (QByteArray) 传递给您的函数,我会得到: QString imeiStr; imeiStr = ConvertToQString(imei);

qDebug() << imeiStr;
"\u0000\u0001@v?[\u05EF"

如果我调试应用程序并显示两个变量(imei 和imeiStr),我会发现一些差异:

imeiStr 更短,并且从位置 4 开始,与原始位置不同。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您可以使用字符串流:

    #include <sstream>
    
    QString ConvertToQString(const QByteArray& array)
    {
        std::stringstream ss;
        for (int i = 0; i < array.size(); ++i)
            ss << array[i];
    
        return QString::fromStdString(ss.str());
    }
    

    【讨论】:

    • 谢谢。我在退货时遇到错误。 “没有功能样式转换形式的匹配转换......”我猜 QString 没有那个转换器。我会检查
    • 是的,你是对的。我已经修改了代码。请检查一下。
    • 我刚刚添加了一些关于您的功能的信息。请检查一下。
    【解决方案2】:
    quint8 source[8] = {0x00, 0x01, 0x40, 0x76, 0xA0, 0xB0, 0x85, 0xA3};
    QByteArray imei;
    for(int i = 0; i < 8; ++i){
        imei.append(source[i]);
    }
    
    qlonglong val = 0;
    for(int i = 0; i < 8; ++i){
        val *= 256;
        val += (quint8)imei.at(i);
    }
    qDebug() << QString::number(val);
    

    【讨论】:

    • 成功了。太感谢了!我试图改变数字而不是相乘。
    • 长时间换档不可用,我遇到了同样的问题。
    猜你喜欢
    • 2014-08-24
    • 2013-10-16
    • 2015-08-01
    • 2020-02-12
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多