【问题标题】:Pushing a QChar in QString在 QString 中推送 QChar
【发布时间】:2016-01-21 07:26:16
【问题描述】:
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a (argc, argv);

    unsigned char VEL_LEFT = 0;
    VEL_LEFT  = VEL_LEFT | 100;

    QString packet;
    packet.push_back (QChar (VEL_LEFT));

    qDebug () << "VEL_LEFT: " << VEL_LEFT;
    qDebug () << "packet: " << packet;

    return a.exec();
}

这里的目的是通过 ORing 或 ANDing 来操作 8 位,然后将它们存储在一个字符串中。

然后我想将输出读取为十进制。

这个程序的输出是:

VAL_LEFT: 100
packet: "d"

这里的“d”是什么?

【问题讨论】:

  • 100 是字符“d”的ascii 代码

标签: c++ qt qstring qchar


【解决方案1】:

100 是您的机器对小写 d 字符进行编码的方式。所以

char x = 'd';

相同
char x = 100;

您可能会将数字与表示混淆。一百是一个数字。它可以用字符串“100”表示,也可以用一百辆汽车表示,也可以用像“九十九以上的一个”这样的句子表示。它是相同的数字

“100”是一个表示。以 10 为底,它代表数字 100。但在其他表示系统中,它可以表示其他数字。

您使字符串存储数字 100。然后您使用系统的字符表示打印它。那么,您的系统使用百上的数字来表示字符“d”。

你希望你的字符串存储什么?百号?字符“1”、“0”、“0”?还是什么?

【讨论】:

  • 您确实在字符串中存储了数字 100。但是随后您将字符串的内容打印为字符。数字 100 与系统使用的表示中的字符 d 相同。 (就像数字 10 与以 10 为基数表示的数字字符串“10”一样。)如果字符串存储一个数字,则必须将其输出打印为数字。
  • (或者您的意思是您希望字符串存​​储以 10 为底的数字 100 的表示形式?)
  • Violet 的回答不会让字符串存储数字 100。它会使其存储字符串“100”。 (可以表示一百,或二进制中的四,或任何数量的其他东西。)
  • @VioletGiraffe 这将使这个特定的 OP 对值和表示之间的区别产生非常严重的误解,这将对他未来的编程工作造成毁灭性的影响。
  • @DavidSchwartz 感谢您的进一步解释和理解我的困惑。我会再次解释。我想首先通过 oring 或 anding 来操作 8 位。然后我想将它们存储在一个字符串中。然后我想将输出读取为十进制。
【解决方案2】:

看起来像你想要的
packet.push_back (QString::number(VEL_LEFT));

而不是
packet.push_back (QChar (VEL_LEFT));

QString::number 接受一个数字并返回一个带有该数字表示的字符串。
例如。如果VEL_LEFT 等于100,QString::number 将返回字符串“100”。

【讨论】:

    【解决方案3】:

    我想首先通过 ORing 或 ANDing 来操作 8 位。然后我想将它们存储在一个 QString 中,然后我想将输出读取为“十进制”。

    以下作品。

    #include <QCoreApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a (argc, argv);
    
        unsigned char SOP         = 0;
        unsigned char E_STOP      = 0;
        unsigned char DIRECTION   = 0;
        unsigned char VEL_LEFT    = 0;
    
        QString packet;
    
        packet.append (SOP);
    
        E_STOP    = E_STOP | 1;
        packet.append (E_STOP);
    
        DIRECTION = DIRECTION | 3;
        packet.append (DIRECTION);
    
        VEL_LEFT  = VEL_LEFT | 100;
        packet.push_back (VEL_LEFT);
    
        qDebug () << "VEL_LEFT: " << VEL_LEFT;
    
        qDebug () << "packet0: " << (int)packet[0].toLatin1();
        qDebug () << "packet1: " << (int)packet[1].toLatin1();
        qDebug () << "packet2: " << (int)packet[2].toLatin1();
        qDebug () << "packet3: " << (int)packet[3].toLatin1();
    
        qDebug () << "packet: " << packet.length();
    
        return a.exec();
    }
    

    【讨论】:

      【解决方案4】:

      你可能想要的是这个?

      unsigned char tmpString[4];
      *(uint32_t *)tmpString = 3158065;
      

      “100”是(就像您在键盘上键入一样)一个“1”(ascii 49)后跟两个“0”(ascii 48)和一个 0,用于确定字符串的结尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多